Repository navigation
Description
Outside the plan: Pascal assigns this card. Its pull request says that it is outside the plan. It follows #420, whose pull request #421 is open and not merged. Stack this work on the branch feat/420-intake-proofs of #421. This is the last pass of the day-1 trials.
Problem
In round 5 of the day-1 trials (2026-11-01), three fresh agents each built an extension from the head of #421 (2f813aa), in parallel. Then an independent judge replayed the same 36 cases on each extension.
These parts of the loop held in all three builds:
- An agent that wrote none of the code reviewed each round.
- The ledger kept every finding.
- Each first failing run that the ledger recorded was real.
- Each agent stopped at the limit of 5 rounds, and
just finishfailed while findings stayed open.
The replay score was 35, 36, and 36 of 36. But no build reached "Done when" in 5 rounds, as in round 4. The judge gives this cause: the authors and the reviewers find one variant of a family of cases at a time. Each narrow fix then lets the next review find a sibling variant or a regression. The 5-round limit only contains this pattern. It does not cause it.
The judge also found these gaps in 2 or 3 of the 3 extensions:
- No complete matrix before the first review (3 of 3). No build had the full list of case families with tests before its first review.
- Private text in data that a reader needs (3 of 3). No build had a test file for this generic case, and two builds keep the private text.
- Intake that cites without a read (3 of 3). The intake names a part of a source, but the transcript shows no read of it.
The judge confirmed #422 from the source. It also found a gap that only the SDK can own. A finding of the current round with no state is open, but ## Open lines can omit it.
One agent found a bug of ncly itself: ncly stops with a panic at startup, even for --version, when the path of the working folder holds %.
Scope
1. Deliver #422 in full
just finishfails on a free-form grade such asGrade: block,warn-level, or a table cellreally a warn. Ordinary prose that holds the words "block" or "warn" still passes. State the exact limit of the parser indocs/north-star/contract/finish-gate.md. The reviewer gives each grade only in the bullet Severity.just signoffruns the recorded first failing run again, at the commit of the scenario, in an isolated scratch folder. The run must fail with the same assertion. The run uses a scenario recipe from an allowed list.just signoffnever runs the text of the record as a shell command.
2. One complete matrix before the first review
This is the change with the highest expected benefit.
- Before the review of round 1,
spec.mdholds a matrix of case families. The matrix comes from each generic case that applies and from each family that the intake found. An example of a family is each way that the input declares how to read it. - Each refusal and each branch that classifies an input has a pair of tests. One input must pass, and one input must be refused.
- The first reviewer checks that the matrix is complete and runs it, before it reviews any repair.
- A repair adds tests for its whole family, with a pair of tests, not only a test for the reported example.
Add this rule to template/.agents/skills/nicely-extension/SKILL.md, readiness-review.md, and template/spec.md.jinja. If a check is practical, just finish fails when a family of the matrix has no test. Otherwise, AGENTS/rule-index.md says "Prose only".
3. Private text in data that a reader needs
Before the first review, the tests of the extension make a test file with a block that a reader needs. That block uses a value that is not the default, and it holds private text. The acceptance check proves both results with an independent reader:
- The private text is not in the output.
- The output still shows the content correctly.
A changed handler that keeps the raw block must fail the acceptance check. Change docs/north-star/contract/generic-cases.md, docs/north-star/contract/test-kit.md, the template skill, and template/acceptance.sh.jinja.
4. A read for each fact of the intake
In intake.md of the template skill, each settled fact links the part of a source that the agent read, at a fixed revision. A fact without a read is marked as an inference. Each unknown fact becomes an open line with an ID before the spec. In readiness-review.md, the reviewer of round 1 refuses a fact that only cites a source.
5. A finding with no state is open
In sdk/extensionrepo/ledger.go, a finding of the current round with no state has the state open. ## Open lines must name it. just finish fails with its ID when ## Open lines omits it.
6. % in the path of the working folder
ncly reads its schema with a path that it parses as a file:// URL in internal/cli/describe.go. A % in the path of the working folder then stops ncly with the panic invalid URL escape. The bug exists before the day-1 passes. Make ncly work in a folder whose path holds %, with a test that fails first.
7. Scratch folders and tests without system services
- Each experiment of an agent uses a new scratch folder. The agent does not delete files recursively inside
sh -cor a loop. A coding harness can stop such a command and wait for an approval that nobody gives, and two trials lost time to it. - The tests and
just acceptanceof an extension need no root, no mount, and no system service.
Rules for the text
- Take each new example from text files or from the
inspectcommand of the template. Do not add an example that names an existing extension or a file format of a specific domain. - For each new rule,
AGENTS/rule-index.mdnames the check that enforces it, or it says "Prose only".
Out of scope
- feat(template): bâtir une extension à plusieurs agents dans T3 Code (un code, un autre vérifie) #414 and its items. Do not change feat(template): bâtir une extension à plusieurs agents dans T3 Code (un code, un autre vérifie) #414.
- A merge of ✨ feat: template: a build stops at 5 rounds, and a ledger keeps every finding #418 or ✨ feat: template: finish proves the first failing run and one state of open work, and release runs finish again #421, and a release.
Done when
just checkpasses.- Each case of template: some free-form grades still pass finish, and a forged first failing run passes #422 has a test that fails first and then passes. A benign prose control passes.
- Tests fail first on these states, and then pass for a correct repository:
- A first failing run that records
echoor a compile error as its command - A finding of the current round with no state, beside
None.under## Open lines ncly --versionin a folder whose path holds%
- A first failing run that records
- The pull request has the branch of ✨ feat: template: finish proves the first failing run and one state of open work, and release runs finish again #421 as its base, and it passes
just signoff. Pascal decides when it merges.
Activity
🐛 fix: contract: ncly starts in a folder whose path holds a percent sign
🐛 fix: template: finish fails on a grade in free form, and states its…
🐛 fix: template: a finding of this round with no state is open
✨ feat: template: just signoff runs the first failing run again
✨ feat: template: spec.md lists one case matrix before the first review
📝 docs: template: each fact of the intake links the part that the age…
📝 docs: template: a test file with private text in a block that a rea…
🐛 fix: template: an ordinary table cell that ends with block passes f…
🐛 fix: template: a stateless advise can be declined, and other review…
📝 docs: template: the reviewer marks a repair fixed only with a pair …
🐛 fix: template: finish reads None in code in the matrix, and no grad…
📝 docs: verify-nicely: the loop text of the template names its case m…
♻️ refactor: docs: move the limit of the parser to its own file