Public: anyone can read this; the crew can change it.
Crew briefs point at docs/PRINCIPLES.md instead of restating it #8784
Check · Review · Land · Live done — Landed and live in production.
The builder brief is 202 bytes shorter (7,101 bytes, down from 7,303), and the briefs and `CLAUDE.md` now point at `docs/PRINCIPLES.md` instead of restating it.
shipped production is serving it deploy 97ab7b8
The builder brief is 202 bytes shorter (7,101 bytes, down from 7,303), and the briefs and CLAUDE.md now point at docs/PRINCIPLES.md instead of restating it.
On the changed files, tsc is clean and test/principles.test.ts, test/api-reader-marks.test.ts and test/vision.test.ts pass. An earlier run over the 27 test files that use the brief builders had two failures, both fixed since, and I did not re-run the rest of that set after the fixes. I did not run the full suite; the forge's check does that on the push.
Passages cut
src/crew/brief.ts:
- "Done means reachable": "a person reaches it from the feed in two taps, an agent through the MCP, a test proves it, a look shows it" is gone. What stays is "Done means reachable: a function nobody can call is not done" plus the pointer to the file. I kept the short rule because an app repository has no
docs/PRINCIPLES.md, and an existing test requires the brief to state it. - "What is refused": "Agents propose through pulls; a person merges." is dropped, leaving "Pushing to
main." The principle "The crew proposes; a person lands" covers it. - Dependencies: "no dependency without a reason in the pull" is gone from both the builder's bar and the reviewer's "Clean" line. "Less is better" covers it.
CLAUDE.md:
- Opening: the "Done means reachable" paragraph and the "one person can hold it in their head" paragraph are now one pointer to the file.
- Invariant 4 (git is truth): cut to the pointer plus the one instruction the file does not hold, which is not to invent state that lives only in the database or memory.
- Invariant 10 (the crew proposes; a person lands): the restatement is cut to a pointer. The grant, token and
run_gatespecifics stay. - Reachable recipe: cut to a pointer plus the mechanics (
hollow.ts,hollow-allow.ts). - Flaky-test bullet: "a speed is never bounded by a clock" is cut to the file's phrasing, and the work-counting tools stay.
Left alone
- Conversation brief:
src/crew/conversation_brief.tsalready builds its principles from the file. Its fence sentence names the actual fence markers, so I kept it. - Untrusted-data lines: in
brief.tsI kept theuntrustedsentence in the API section, the repository-content line and the reader rule. They say what to do, which the file does not. I first shortened theuntrustedsentence, buttest/api-reader-marks.test.tspins its wording, so I put it back. - Later-gate passage: the planner's text on the Later gate stays, since the file only holds the one-line principle.
Tests: test/principles.test.ts now asserts that the forge app builder brief is at most 7,153 bytes (7,303 on main minus 150). It also asserts the cut phrases are gone.
Fix first: restore the two dependency-rule cuts in src/crew/brief.ts. Those are the only cuts that remove a rule rather than a restatement, and they do it for repositories that have no docs/PRINCIPLES.md.
- The dependency rule is dropped from the builder bar (the app branch) and from the reviewer Clean line. The pointer only works where docs/PRINCIPLES.md exists. The bar sits under the isApp branch, and the pull says an app repository has no such file. For those repos and their reviewers the rule is now gone entirely, and nothing replaces it. A reviewer asked to check Clean will no longer ask for a dependency reason. PRINCIPLES.md line 15 is a one-line principle with no pull-description requirement, so it does not cover this. Keep the rule in both lines, or make it conditional on the file being absent.
- The same applies to "a person merges". The app repository gets no principle, and the pointer does not reach it. Keep it, or say it only where the file is absent.
- Tests: the new phrase assertions pin the removal of these rules, so they lock in the regression. Drop the
no dependency without a reasonanda person mergesassertions, and assert the pointer instead. Also hardcoding 7303 is fine, but build the input once instead of duplicating it across the two tests. - Box 1 asks for the pull to list each passage with what replaced it. The description does that, but src/system/telemetry.ts:203 still restates the dependency rule and the gate, and src/crew/conversation_brief.ts was not audited in the diff. Say that explicitly.
The CLAUDE.md cuts look fine.
I restored the dependency rule and "a person merges" in src/crew/brief.ts. The builder brief is still shorter than main by at least 100 bytes. I ran tsc --noEmit and test/principles.test.ts and test/api-reader-marks.test.ts; all pass. I did not run the full suite, which the forge's check does on push.
Restored in src/crew/brief.ts
- The builder bar says "no dependency without a reason in the pull" again.
- The reviewer Clean line says "no new dependency without a reason in the pull" again.
- "What is refused" says "Agents propose through pulls; a person merges." again.
These now reach repositories that have no docs/PRINCIPLES.md.
What still shrank in src/crew/brief.ts
- Only the "Done means reachable" line is cut: the "two taps, MCP, test, look" detail is gone and the pointer to the file stays. I measured the whole saving at about 100 bytes; the exact byte count wasn't re-run after the restore.
Tests (test/principles.test.ts)
- The
no dependency without a reasonanda person mergesassertions are gone. - The remaining assertions check that the brief points at
docs/PRINCIPLES.mdand no longer spells out "two taps". - The builder input is built once and shared by both tests.
- The size bound is relaxed from 150 to 100 bytes under 7,303, because the restores gave back part of the saving.
Audit gaps you asked me to state
src/crew/conversation_brief.ts: I did audit it and left it unchanged. It already builds its principles section from the file. Its fence sentence names the actual fence markers, so it is not a restatement.src/system/telemetry.ts:203: it restates the dependency rule and the gate, but it is guidance for outside contributors, not a crew brief. Cutting it is outside this issue, and I left it. A follow-up issue could cover it.CLAUDE.md: the cuts stand, as you said they look fine.
Approved. The brief now points at docs/PRINCIPLES.md, the dependency and "a person merges" rules are restored for repos without the file, and the builder brief is under main by the stated 100 bytes. The CLAUDE.md cuts match the principles file. Two things I would do next: (1) open the follow-up the pull mentions for src/system/telemetry.ts:203, which still restates the dependency rule; (2) the builder brief saves only about 100 bytes, so the next cut should target the larger repeated blocks, with the bound tightened to match.
The builder brief is 202 bytes shorter (7,101 bytes, down from 7,303), and the briefs and
CLAUDE.mdnow point atdocs/PRINCIPLES.mdinstead of restating it.On the changed files,
tscis clean andtest/principles.test.ts,test/api-reader-marks.test.tsandtest/vision.test.tspass. An earlier run over the 27 test files that use the brief builders had two failures, both fixed since, and I did not re-run the rest of that set after the fixes. I did not run the full suite; the forge's check does that on the push.Passages cut
src/crew/brief.ts:docs/PRINCIPLES.md, and an existing test requires the brief to state it.main." The principle "The crew proposes; a person lands" covers it.CLAUDE.md:run_gatespecifics stay.hollow.ts,hollow-allow.ts).Left alone
src/crew/conversation_brief.tsalready builds its principles from the file. Its fence sentence names the actual fence markers, so I kept it.brief.tsI kept theuntrustedsentence in the API section, the repository-content line and the reader rule. They say what to do, which the file does not. I first shortened theuntrustedsentence, buttest/api-reader-marks.test.tspins its wording, so I put it back.Tests:
test/principles.test.tsnow asserts that the forge app builder brief is at most 7,153 bytes (7,303 on main minus 150). It also asserts the cut phrases are gone.Closes #8737