Skip to content

Template set 13: the compressed register, the wiki's pages, and RTK at launch - #18

Merged
protonspy merged 3 commits into
mainfrom
template-13-and-launch-rtk
Aug 5, 2026
Merged

Template set 13: the compressed register, the wiki's pages, and RTK at launch#18
protonspy merged 3 commits into
mainfrom
template-13-and-launch-rtk

Conversation

@protonspy

Copy link
Copy Markdown
Owner

Two commits, both from the same session's pending work.

feat(assets) — template set 12 → 13

caveman.md, the register the agent answers in. Short output, unchanged
thinking. The output budget belongs to the code: prose about the work is written
once and then carried in every later request of the session, so narration is the
part of a long run that can be cut without losing a fact.

It ships as a rule rather than a skill because it is on by default, and a
default the model has to decide to load is not one. One level (ultra) rather
than a dial, because three descriptions of the register are three things to keep
true instead of one. What never compresses is the line that keeps it honest:
artifacts under specs/, plans/, docs/, anything a validator parses or a
shell runs, quoted output, commit and PR bodies, and questions put to the user.
A denser EARS line is a finding, not a saving.

The language is the third kickoff answer. autonomy.md asks it with the
other two and it lands in the artifact's frontmatter as lang: en|wenyan,
graded by checkKickoffAs on exactly the terms autonomy and ci are —
checked when present, absent meaning the run predates the question. There is no
--lang flag on spec new or plan new: it is the one answer that can arrive
after the file exists, so scc patch fm <artifact> lang=wenyan is the whole
path to it, and a value neither the rule nor the validator knows rolls back like
any other bad edit.

Also in the pass:

  • The wiki's pages move to docs/wiki/pages/, so index.md and
    changelog.md are told apart from content by where they sit rather than by
    their names. The validator used to exclude them by matching those names, which
    made any other .md dropped into wiki/ a page, and then an orphan.
  • Three places prose stated a mechanism exactly and left the judgment unsaid
    where an agent fills the gap with the cheapest reading. The plan-run command
    said "read the plan" where the skill it invokes says map it; the review agents
    asked for surrounding code without saying the diff already held it; the wiki
    skill explained how a slug resolves without saying the name has to name the
    concept.

feat(launch) — RTK joins the launch preflight

scc launch already brought Headroom and CodeGraph up to date; RTK was the
third and the one left to the user to remember. It degrades the way the other
two do — missing cargo, declined install, unattended run, failed build all end
in the agent starting anyway — and --no-rtk is the standing answer.

Two things it does differently, both because it is the only one of the three
that writes to a file the user owns: it runs last, so a run aborted at an
earlier prompt has not already edited the entry file, and its prompt names
both halves
, since consenting to an install is not consenting to an edit.

confirmInstall is a second confirm() defaulting to yes, used only by these
install offers. A wrong yes here is a tool that can be uninstalled; a wrong no
is a whole session running degraded. confirm() keeps its no-by-default,
because what it guards is somebody's file.

Verification

gofmt -l, go vet ./..., go test ./... all green. The race detector needs a
C compiler this machine does not have — CI's Linux and macOS jobs run it.

  • TestRulesStayShortEnoughToBePreloaded holds caveman.md inside the 55-line
    budget, which is what keeps a preloaded rule affordable.
  • TestTheRuleOffersEveryKickoffAnswerThisAccepts is new and fails if the rule
    and the validator ever name different values for a kickoff answer.
  • New coverage for lang on both the spec and the plan side, and an end-to-end
    patch fm test for the write and for the rollback.
  • Smoke-tested in a scratch workspace: init writes .claude/rules/caveman.md,
    patch fm specs/billing/requirements.md lang=wenyan writes and re-validates
    clean, lang=pt-BR rolls back with spec.kickoff-invalid and exit 2.

🤖 Generated with Claude Code

https://claude.ai/code/session_01DmGyL6QvamMBKdHYyrx7Uq

protonspy and others added 3 commits August 4, 2026 23:36
…age it answers in

Template set 12 -> 13.

caveman.md is the register the agent answers in: short output, unchanged
thinking. The output budget belongs to the code — prose about the work is
written once and then carried in every later request of the session, so
narration is the part of a long run that can be cut without losing a fact.

It ships as a rule rather than a skill because it is on by default, and a
default the model has to decide to load is not one. One level (ultra) rather
than a dial, because three descriptions of the register are three things to
keep true instead of one. What never compresses is the line that keeps it
honest: artifacts under specs/, plans/ and docs/, anything a validator parses
or a shell runs, quoted output, commit and PR bodies, and questions put to the
user. A denser EARS line is a finding, not a saving.

The language is the third kickoff question in autonomy.md, recorded as `lang:`
beside the two answers that were already there — the register is a decision
about the whole run, so it belongs where the run's other two decisions are and
not in a preference re-asked every session. Both spec and plan grade it through
checkKickoffAs on exactly those terms: checked when present, absent meaning the
run predates the question. There is no --lang flag on `spec new` or `plan new`,
because it is the one answer that can arrive after the file exists, so
`scc patch fm <artifact> lang=wenyan` is the whole path to it and a value
neither the rule nor the validator knows rolls back like any other bad edit.

Also in this pass:

- The wiki's pages move to docs/wiki/pages/, so index.md and changelog.md are
  told apart from content by where they sit rather than by their names. The
  validator used to exclude them by matching those names, which made any other
  .md dropped into wiki/ a page, and then an orphan.
- Three places a real workspace showed scc stating a mechanism exactly and
  leaving the judgment unsaid: the plan-run command said "read the plan" where
  the skill it invokes says map it, the review agents asked for surrounding
  code without saying the diff already held it, and the wiki skill explained
  how a slug resolves without saying the name has to name the concept.

Verified: gofmt, go vet, go test ./... green. The race detector needs a C
compiler this machine does not have; CI's Linux and macOS jobs run it.
TestRulesStayShortEnoughToBePreloaded holds caveman.md inside the 55-line
budget, and a new TestTheRuleOffersEveryKickoffAnswerThisAccepts fails if the
rule and the validator ever name different values. Smoke-tested end to end in a
scratch workspace: init writes .claude/rules/caveman.md, `patch fm
specs/billing/requirements.md lang=wenyan` writes and re-validates clean, and
lang=pt-BR rolls back with spec.kickoff-invalid and exit 2.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DmGyL6QvamMBKdHYyrx7Uq
`scc launch` already brings the two enhancements a session wants up to date —
Headroom's proxy and CodeGraph's index. RTK was the third, and it was the one
left to the user to remember: a workspace whose entry file has no usage block
starts every session paying full price for command output.

It degrades exactly the way the other two do, because an enhancement that
blocks a launch is worse than no enhancement: a missing cargo, a declined
install, an unattended run, or a failed build all end in the agent starting
anyway with a warning saying why. --no-rtk is the standing answer.

Two things it does differently, both because it is the only one of the three
that writes to a file the user owns:

- It runs last, so a run aborted at the Headroom or CodeGraph prompt has not
  already edited somebody's entry file.
- Its prompt names both halves — building the binary and splicing the block —
  since consenting to an install is not consenting to an edit, and the user
  cannot see the second one coming.

The setup itself is applyRTK, which is what `scc rtk` runs, so a launch cannot
drift from the command. rtkLaunchReport is deliberately not `scc rtk`'s frozen
shape: a launch answers the narrower question of whether the binary is there
and whether the entry file carries the block.

confirmInstall is a second confirm() defaulting to yes, used only by these
install offers. The balance is the opposite of confirm()'s: that one guards a
write to the user's own files, where a wrong yes costs somebody's work, while
here a wrong yes costs a tool that can be uninstalled and a wrong no costs a
whole session running degraded. End of input is never an answer; --yes is how
an unattended run says yes.

Verified: gofmt, go vet, go test ./... green. The new tests cover the report
being present with a reason when cargo is absent, --no-rtk omitting the field
entirely rather than reporting a skip, --no-install declining to offer the
cargo build, and confirmInstall's inverted default including end of input.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DmGyL6QvamMBKdHYyrx7Uq
`root := t.TempDir()` at the top of TestKickoffLanguage was overwritten by every
case below it before anything read it, which ineffassign fails the lint job on.
Each case now declares its own, which is what the test meant: a case gets a
clean workspace, and none of them shares one.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DmGyL6QvamMBKdHYyrx7Uq
@protonspy
protonspy merged commit 5996d7b into main Aug 5, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant