Skip to content

template: one case matrix before the first review, replay the first failing run, and deliver #422 #423

Closed

Description

@pascalandy

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 finish failed 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 finish fails on a free-form grade such as Grade: block, warn-level, or a table cell really a warn. Ordinary prose that holds the words "block" or "warn" still passes. State the exact limit of the parser in docs/north-star/contract/finish-gate.md. The reviewer gives each grade only in the bullet Severity.
  • just signoff runs 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 signoff never 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.md holds 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 -c or 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 acceptance of 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 inspect command 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.md names the check that enforces it, or it says "Prose only".

Out of scope

Done when

Activity

  1. added
    1-ready-for-agentValidated work, sufficiently specified for an autonomous agent
    2-type:featureNew or improved functionality; specification lives in the issue
    3-pty:p2Normal planned work; default when no priority is established
    on Nov 1, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    1-ready-for-agentValidated work, sufficiently specified for an autonomous agent2-type:featureNew or improved functionality; specification lives in the issue3-pty:p2Normal planned work; default when no priority is established

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions