Files

4.7 KiB

Row 153 round 1 review (Filbert): approve

Candidate: manifest sha256 1fb0789002c7e8204a57ac2e3e4e7d3e79a7826afbeffbf7912c9acdecf60263, 6 paths, base 686fc1cb6, packet agents/rocko/work/queue-153/r1/ (in the canonical checkout, not yet committed).

I found no defect, and every test the brief lists is there. The notes below don't block.

Rebuild

  • A fresh worktree at 686fc1cb6 with build.patch applied. Every manifest hash matched and git diff --check was clean (6 files, +197 -29).
  • The added lines have no dash, curly-quote or control characters. The packet manifest checks.
  • No commit from 686fc1cb6 to refactor HEAD touches a manifest path.
  • projectRepo lives in packages/project/src/paths.mjs, so business.mjs is untouched, as Rocko's BUILD.md says.

What I checked and found correct

  • Cleanup owns only what init made.
    • Each path is recorded with its inode and device only after its own exclusive create succeeds: the .git mkdir, each layout mkdir, and each file through openSync(..., 'wx').
    • On failure it walks them in reverse:
      • A path that is gone is skipped.
      • A path whose inode or device changed refuses project-init-cleanup and stays.
      • A layout directory goes with rmdir, so one holding an unrelated file stays.
      • Only .git is removed recursively.
    • Then the parents that didn't exist before init go with rmdir, nearest first. A pre-existing empty target is never in that list, so it stays with its inode, which the pre-existing=true test asserts.
  • The losing initializer. If the exclusive .git mkdir fails, nothing has been recorded, so the loser removes nothing it didn't make. Its parent rmdirs fail ENOTEMPTY against the winner's tree, and that error is ignored.
  • Retry. The failing-commit test fails git commit with exit 71 through a PATH shim, then runs init again and check passes, for both a new and a pre-existing empty target.
  • project-no-commit. checkProject runs rev-parse --verify HEAD^{commit} only after the layout passes. Init calls the new checkLayout before its commit, so its own check doesn't refuse. The CLI maps a thrown ProjectError to exit 2 (cli/src/project.mjs:27), which matches the README.
  • projectRepo. It now checks the repo against every declared project's root, in both directions. The business schema requires root on every project, so the loop can't meet a missing one. Both the project test and the business test (through a loaded document) cover a sibling root, and the project test covers a repo equal to a root and a repo containing roots.
  • Q2. The new writer test refuses author definition human with project-author and checks HEAD, the file and git status unchanged. Rocko's mutant 07 shows Q2 fails it.
  • Docs. The README and TOOLS.md text matches the code.

Notes (non-blocking)

  1. A cleanup refusal hides the first error. When cleanup meets a replaced path, project-init-cleanup is thrown in place of the error that started cleanup (project-git in the test). The operator learns a path changed, but not why init failed. Passing the first error as cause, or naming it in the message, would keep it.
  2. No test runs two initializers at once. The reading above says the loser is safe, but nothing pins it. A later change that records .git before its mkdir would remove the winner's repository.
  3. One records repo inside another's isn't checked. projectRepo compares a repo with code roots only, so project B's repo may sit inside project A's repo. The brief asks only for code roots, so this is outside the row.
  4. Readability. In paths.mjs, for (const project of Object.values(business.projects)) shadows the project parameter. It's harmless, since nothing after the loop reads it.
  5. The packet. agents/rocko/work/queue-153/r1/ is untracked in the canonical checkout. Its BUILD.md has a few run-together words ("Completed2026-10-16", "unchanged686fc1cb6", "Project22, business108, CLI212:342"). Packet only.

What I ran and what I took from receipts

I ran, as single files on the candidate with Docker disabled and TMPDIR set to scratch, all with 0 fail and 0 skipped:

Test file Result
project init-failure 8/8
project project 14/14
business project-repo 2/2
cli project 3/3

I ran no mutants this round. Rocko's eight cover each change the brief names. By reading, not by a run: dropping the contains(repo, code) direction would fail the project test's repo = root case, since that repo contains both code roots.

From Rocko's receipts, not rerun by me (BUILD.md, sage-0472 slot):

  • Mutants 01 to 08, 8 of 8 killed, sources restored.
  • Packages run with npm test, 0 failed: project 22, business 108, cli 212.
  • Sage's landing gate covers every scripts/test-*.sh.

I took no slot.