Repository navigation
feat!: Phase 13 — subtract and repair, with the ADR-030 strategy refresh - #60
Merged
Merged
Conversation
Closes the four P1/P4 items the 2026-10-02 product check handed to /plan-product --reconcile, and records the drift that accumulated since. Phase 12 realigned. mission.md said "committed" while roadmap.md and mission-lite.md said implemented and released; the roadmap now reads "implemented and released, v0.40.0 — human UAT open" and mission.md matches. Success criteria 1-3 are marked met against re-derived evidence: the app-verify fixture app and its four recipes, the prose-only count of 1 in implement-story.md and its .lean twin, and the missing-evidence mutation test in test_exit_criteria.py. The phase's own UAT plan is unticked, so human UAT is named as the open item. Phase 11's gate bullet keeps its historical claim and gains a forward note: Gate 4.5 still declares prose-only, but Phase 12 moved the verdict to scripts/app-verify.py. v0.41.0 recorded. Two condensed-history rows: the transcript /retro, and the agent CLI contract (ADR-029), Complete on feature/agent-cli-contract and marked unreleased. mission.md's self-improvement differentiator now credits /retro as a second evidence channel. GBrain demoted from the integration to a worked example, after the consumer-less gbrain-interop skill was removed in v0.41.0; the recipe doc stays and the adapters link it. Friction-signals parking-lot entry narrowed to what /retro did not absorb — signal emission, the /status nudge, and Signal: as refresh evidence — and resized M to S-M. Five roadmap links repointed to specs/archive/ where they resolve. No direction change and no new ADR: the ADR-025 amendment and ADR-029 already covered both shifts. roadmap-sync and docs-check eval checks pass. .writ/context.md is deliberately not touched here. It is regenerated by /status and its branch version described a spec active only on feature/agent-cli-contract; carrying that onto main would assert a state main is not in. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…rison Two workspace artifacts that were sitting untracked. The issue proposes that a command play back the goal and the problem in its own words before starting work. The research document is the first full Writ/pstack comparison, read from pstack 0.15.28 at cursor/plugins d457567. Earlier borrowing was mechanism-by-mechanism through ADR-028, ADR-029, and two open issues. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Research into making /prototype produce multiple visual drafts before specification, plus the two defects the investigation turned up. The recommendation is against the premise. /prototype's frontmatter says the repository gains no planning artifact, and its terminal constraint forbids writing spec artifacts; pre-spec concept exploration is a planning artifact. Its Step 2.5 preview also runs after Context Scan has already scoped files to a change, which is the wrong moment to be choosing a direction. The gap belongs to /design, whose exit criteria currently require a spec folder that does not exist yet, and whose Mode A is already a roadmap parking-lot item. The finding that shapes the design: the obvious implementation does not work. Dow et al. (2010) measured parallel prototyping beating serial, but both conditions built five prototypes — the variable was withholding feedback until alternatives existed, not making more artifacts. The benefit does not transfer to AI variants. LLMs fixate on their own early outputs, repeated samples converge, independently trained models converge on each other, and a CHI 2024 experiment (N=60) found designers using an AI image generator produced fewer ideas with less variety and lower originality than the no-AI baseline. Asking one agent for "a few options" is three samples from one mode. What does produce divergence, per the same literature: orthogonal axes declared before generating, independent generation contexts, chain-of-thought first, and ordinary rather than genius personas. Recommended option is a design-divergence skill plus a /design --explore mode — no new command. Claude Code shipped a native /design that produces artboards before code, so Writ should own the brief and the decision record, including why each rejected draft lost, and delegate rendering to the platform. That closes a parking-lot item instead of opening one, and satisfies ADR-009, ADR-015, and Design Principle 4. Two verified defects filed as bugs: - /prototype names the Cursor-only cursor-ide-browser tool at lines 89 and 113, and no adapter translates it, so Step 2.5 has no runnable tool on Claude Code, Codex, or OpenClaw. This breaks the platform-agnostic tool-name convention CLAUDE.md states. - Writ's /design collides with Claude Code's native /design. In this session the listing resolves to Writ's command, which is consistent with shadowing but does not prove it; the issue is blocked on a clean-room check. Evidence for the native /design is secondary reporting only; Anthropic's own docs did not surface, and the research flags verifying it as the first open item. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…oration Revises the research after maintainer review. The first draft's central conclusion — do not host pre-spec exploration in /prototype — is withdrawn. The original F1 reasoned from /prototype's frontmatter to the conclusion that exploration does not belong there. That is circular. A contract line is a decision someone made and can amend; it is not evidence about where a capability belongs. The draft treated an amendable sentence as a boundary. The adopted position: /prototype is reframed as the early, preliminary exploration workflow. It invokes design and other skills to give a broad but genuinely real sense of the end in mind, and stops before deep specification or planning. Three supports the first draft under-weighted: the command's own When to Use table already claims "exploring an approach before committing to it"; it already has both a visual step and the escalation hatch into /create-spec --from-prototype; and "end in mind" needs code-adjacent realness that a mockup cannot give. The reframe is also leaner than the draft's proposal, since it needs no new /design mode. F3, F4, F5 and F6 survive unchanged. The divergence evidence is about how models generate alternatives and does not depend on which command hosts them: declared orthogonal axes, independent contexts, reasoning before rendering, and ordinary rather than genius personas. Asking one agent for three options remains three samples from one mode. The one concern the reframe does not dissolve is carried forward rather than dropped. ADR-020 allows a command one outcome, so "explore" and "ship a small change" cannot both be it. Recommended resolution: the outcome is the recorded choice among several real takes, and shipped code becomes a terminal state of that rather than the definition of done. If the amended exit_criteria cannot be written as a short checkable list, the reframe is too big. Also added: a build order, a stakes-gating requirement so a one-line fix still runs as it does today, and an open question on how much realness "end in mind" actually requires, since that sets whether drafts are rendered-only or code-backed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Direction change recorded in ADR-030. Writ owns the contract, the verifier, and the boundary, and users reach it through one front door. Phases 13-16 are committed: Subtract and Repair, Front Door and Distribution, Code-Level Rigor, and Verified Landing (gated on Phase 12's human UAT). Phase 13 covers every defect the pstack and /prototype research found. Friction signals are retired: ADR-025 Decisions 1, 3, and 6 are superseded, and ADR-029's review trigger now reads /retro findings. Plugin distribution and the empirical-fork rule move from the parking lot into Phase 14. Design Principle 7 (subtract before you add) is added. mission-lite.md is regenerated. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts: # .writ/product/roadmap.md
Five contract-locked specs from the /implement-phase 13 decomposition: ci-and-update-integrity (widened to fix the update.sh baseline data loss), harness-cuts, claude-code-parity (widened to keep CLAUDE.md user-owned on uninstall and reinstall), platform-neutral-names (/design renamed /writ-design), and shipped-command-hygiene. Also files three issues found while grounding the specs, and aligns the roadmap's /design criterion with the rename decision and the internal-links criterion with runtime paths. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Story 1 of 2026-10-20-ci-and-update-integrity (CI Runs Every Suite). - eval.yml: setup-uv@v7, `uv run --python 3.9 pytest`, and a bash step that counts failures and exits non-zero. The new steps run with !cancelled() so every red suite reports. - scripts/tests/test_ci_workflow.py: 9 tests; 7 fail on the pre-fix workflow. - Runner stays ubuntu-latest: no BSD-only calls; an ubuntu:24.04 run passed 35/35 bash tests. Tests: pytest 3.9 2623 passed, 2 skipped; bash 35/35; eval Findings 0. Drift: Small (DEV-001). The GitHub Actions run is pending a push. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Story 2 of 2026-10-20-ci-and-update-integrity. write_copy_manifest read .codex/config.toml.baseline after `cat >` truncated the manifest, so every update dropped the line. It now reads the hash first, as unlink.sh does, and writes it when present. - scripts/tests/test_update_codex_config_baseline.sh: two rewriting updates, a dry run, and the no-baseline case. Fails on the pre-fix script (line count 0, want 1). - Resolution appended to the Codex baseline issue. Tests: pytest 3.9 2623 passed, 2 skipped; bash 36/36; eval Findings 0. Drift: None. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Story 3 of 2026-10-20-ci-and-update-integrity. write_copy_manifest in install.sh and update.sh recorded every file in the tracked folders from its local copy. User files got baselines and were later removed as stale; customized files were re-baselined and later overwritten. - Both scripts walk the shipped set in $WRIT_SRC. Local equals upstream: upstream hash. Preserved: previous baseline, or no line. - update.sh reads baselines from a per-run copy (load_baselines); manifest_hash_for matches the path exactly. - Manifests carry `# baselines: shipped`; install omits it over a header-less manifest. - scripts/tests/test_manifest_shipped_baselines.sh: fails on the pre-fix scripts (user file recorded at install). Tests: pytest 3.9 2623 passed, 2 skipped; bash 37/37; eval Findings 0. Drift: Small (DEV-002, DEV-003). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Story 1 of 2026-10-20-claude-agent-generator. Generates claude-code/agents/writ-*.md from agents/*.md plus a frontmatter overlay, with --check (stale, missing, orphan, unmapped). 2 files created, 2 modified; 364 tests passed (46 on 3.9); 98% coverage. Drift: Small (3 entries). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Story 2 of 2026-10-20-claude-agent-generator. Regenerated 7 claude-code/agents files and added writ-visual-qa.md; bodies now carry the canonical prompt contract (writ-coder gains MAX_SELF_FIX_ITERATIONS and boundary_map rules). Frontmatter unchanged. 1 file created, 9 modified; 196 targeted tests passed, full suite 2672 passed. Drift: None. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Story 4 of 2026-10-20-ci-and-update-integrity. detect_stale_files warned and carried the old baseline only for scripts/. A modified stale command, agent, skill, or doc lost its line on the first update. Every category now prints the same warning and keeps its install-time baseline, on every run, until the user deletes the file. - scripts/tests/test_update_kept_stale_files.sh: five categories, three runs, an up-to-date run, a dry run, delete-then-update. Fails on the pre-fix script. - commands/update-writ.md: frontmatter, Steps 3, 6, 7, and Completion describe shipped-only baselines and kept files. - Resolution appended to the stale-files issue. Tests: pytest 3.9 2623 passed, 2 skipped; bash 38/38; eval Findings 0. Drift: Small (DEV-004, DEV-005). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Story 3 of 2026-10-20-claude-agent-generator. check-agent-parity.sh folds both generators' --check reasons and drops the visual-qa exemption; eval.sh gains the claude-agents check; adapter and refresh-command docs cover all eight agents and the regenerate commands. 1 file created, 5 modified; 29 + 7 bash assertions passed. Drift: Small (DEV-004..006). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The integration eval run reported untested_criterion AC-3.5 once Story 3 closed. Two tests pin the adapter's Agent Paths rows (derived from OVERLAY) and the refresh-command regenerate command. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…r real path Story 5 of 2026-10-20-ci-and-update-integrity. - A manifest without `# baselines: shipped` is legacy. update.sh rebuilds its baselines from upstream at its `# version:`, running one `fetch --unshallow` if the shallow clone lacks it. Paths upstream did not have then are user files and get no baseline. - Unresolvable version: only the Codex config line is kept, one notice is printed, and differing files are preserved. - Cursor rule and system-instructions with no baseline are updated only when no manifest exists; otherwise preserved. - Stale skills are removed from $SKILLS_DIR (.agents/skills on Codex). "Removed" is printed only when the file is gone; a path rm cannot remove keeps its manifest line. - scripts/tests/test_update_legacy_manifest.sh; fails on the pre-fix script (user file removed). - commands/update-writ.md Step 3: one sentence on legacy manifests. Tests: pytest 3.9 2623 passed, 2 skipped; bash 39/39; eval Findings 0. Drift: Medium (DEV-007: Cursor scan blocks); Small DEV-006/008/009. Review iterations: 2. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
All 5 stories completed. Integration run after the final story: uv run --python 3.9 pytest 2623 passed, 2 skipped; bash tests 39 run, 0 failed; eval.sh Findings 0; gen-skill --check pass. The same suites passed in an ubuntu:24.04 container. exit-criteria.py implement-spec: met (c1, c2, c3). Drift: 8 small, 1 medium (DEV-007), 0 large. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Brings in the claude-agent-generator spec committed on the phase branch by another session. The one conflict, .writ/context.md, keeps the lane's snapshot; /status regenerates the file. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The spec is Complete and released in v0.42.0. Commits the move another session left uncommitted in the main checkout. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
implement-story.md's Step 4 report naming "`gate3-route:`, `review-panel:`" is wording no gate reads, and test_review_panel.py's test_report_names_the_panel_lines still asserts the sentence directly. The pin and its mutation test, test_report_entry_pin_bites, go together. The panel paragraph, the block-is-a-Gate-3-FAIL rule, and the --panel row stay literal, and their mutation tests stay (pin-map.md row 198 remove; 195-197 keep). Spec: 2026-10-20-shipped-command-hygiene, Story 2 (task 2.5). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
All nine pins in check_product_check_direction fixed product-flow wording or forbade retired framing: the direction sentence in verify-spec.md and plan-product.md, three retired "before" framings, the old Step R4 pointer, the /verify-spec --product suggestions in implement-phase.md and release.md, and the old reconcile pointer. None is a safety contract, and test_product_check_direction.py asserts every one of them directly. With no pins left and nothing else to run, the function and its CHECKS entry go. Tests changed with the pins: test_product_check_direction.py drops its eval-copy helper and the two mutation tests (the issue-resolution assertions stay as test_issue_is_resolved); test_harness_cuts.py stops listing the deleted function; test_eval_shipped_refs.py's docstring now cites test_review_panel.py as the eval-copy example (pin-map.md rows 199-207 remove). Spec: 2026-10-20-shipped-command-hygiene, Story 2 (task 2.5). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A file that opens with --- and never closes the block has no frontmatter; a frontmatter row must fail on it rather than read the body as keys. Spec: 2026-10-20-shipped-command-hygiene, Story 2 (task 2.1). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
scripts/ac-trace.py attributes an AC token in a test file to the spec folder name most recently named above it. The comments added to test_harness_cuts.py and test_product_check_direction.py named this spec's dated folder, which moved later AC tokens in those files (the harness-cuts and product-check-direction specs' criteria) onto this spec. The comments now name the spec without its folder name. Spec: 2026-10-20-shipped-command-hygiene, Story 2. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Deleting the product-check-direction eval check also deleted the two tests that ran its mutations, which left the archived spec's AC-1.4 with no test citation. The same mutations now run against this file's direct assertions: the wording holds on the tree, and each mutation (the direction sentence removed, a retired framing or pointer added back) breaks it. ac-trace on 2026-10-01-product-check-direction is clean again. Spec: 2026-10-20-shipped-command-hygiene, Story 2 (task 2.5). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Re-ran the inventory recipe on the final eval.sh: 144 instances at 144 call sites (518 pin call lines parsed, equal to grep -c; the same 22 unresolved spec-file targets). Every keep literal is still pinned on its target, no convert or remove literal remains on its target, and the count fell by 63 (convert 29 + remove 34). Spec: 2026-10-20-shipped-command-hygiene, Story 2 (task 2.6). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The pin map must hold one row per instance with every column, its header totals must match the rows (keep + convert + remove = N, after = keep, so the count fell by convert + remove), no safety-category row may be remove, and every convert row must have its structural row in scripts/eval-command-structure.py. A registry test keeps CHECKS and the check_* functions in step, so a function deleted with its last pin leaves no entry behind. These cite AC-2.1, AC-2.2, AC-2.4, and AC-2.5, which had no test citation. Spec: 2026-10-20-shipped-command-hygiene, Story 2 (tasks 2.5, 2.6). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The harness-cuts guard greps .writ/context.md; the Story 1 snapshot named the retired file suffix. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… AC-1.5 ac-trace credits a test token to the spec folder named most recently above it. The AC-1.1 fixtures name two archived specs, so AC-1.2, AC-1.3, and AC-1.4 were credited to 2026-07-18-logical-unit-revert. Each of those class docstrings now names 2026-10-20-shipped-command-hygiene before its tag. New CalibrationValueTests (AC-1.5) reads the five rewritten calibrated_against values with eval-loop-bounds.py's own parser and checks: a shipped path token or `no recorded run`, refactor keeps `no recorded run`, no .writ/state/ or .writ/specs/archive/ path outside a glob, and eval-loop-bounds.py reports PASS for these commands' schema scenarios and the refactor literal. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… make The path-only invocation row for scripts/phase-state.py accepted any lowercase word after the path, so implement-phase.md's frontmatter note "scripts/phase-state.py cmd_classify" kept it green after every real call became a bare mention. Pin-map row 74 now maps to two rows that name the lane rules' calls: "scripts/phase-state.py create-lane" and "scripts/phase-state.py validate-result". The invocation kind no longer accepts a value without a subcommand, so a bare "x.py" or "scripts/x.py" mention never passes; the self-test covers prose and the frontmatter shape. Tests: a path-only value fails on every line; prose and calibrated_against mentions fail; every table value names its subcommand; a copy of implement-phase.md with only the real calls reduced fails both rows while line 21's note stays; a helper that prints no verdict line is a run error. The table mutation still changes only the value's occurrences. Pin-map reasons corrected: row 74 names the new rows; rows 33-35 name the over-exclusion a "grep -v archive" filter would cause; rows 183-184 no longer claim row 182 proves the sample matches. Spec: 2026-10-20-shipped-command-hygiene, Story 2 (Gate 3 review fix, AC-2.3). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Story 2 of 2026-10-20-shipped-command-hygiene. Command-file literal pins in eval.sh fell from 207 to 144 (keep 144, convert 29, remove 34); converted pins now live in scripts/eval-command-structure.py. 3 files created, 6 modified across the story's commits. pytest 3.9: 2765 passed, 2 skipped; bash tests: 45/45; eval.sh: 0 findings. Review: PASS after 2 iterations. Drift: Small (DEV-004, DEV-005, DEV-006); spec-lite amended. Also records the Story 1 post-completion repair (499dbc5, b129c34). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Every lean-twin change against create-spec.md at 37e097e, decided against the current text: 54 adopted coaching cuts and 16 declined changes, plus the start-state lists the cut must keep. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Remove the Phase 1 interview coaching (topic questions, pushback phrasing, transition phrases, the Plan Mode rationale in Step 1.2) and fold the duplicated framing in the --from-prototype and --from-issue flows. Every step, gate, AskQuestion block, and script call stays; Step 1.2 is left as a numbering gap. Add the guard that the recorded create-spec overage falls below its Story 3 start value and 29304, and repin it to the new overage. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Remove text that points at Writ's own development: the "Enhanced" title label, "per Business Rule 8", the leanness-instrumentation example, the "(new)" label, "exactly as today" and "today's error path", and the Goal Card Stage 3 note in Step 2.6c. Repin the create-spec overage to the new value. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Remove Step 2.1 (task-tool tracking with no output), the Step 2.6b "Why this step exists" paragraph, the spec-lite budget breakdown and content-selection list, and repeated framing in Steps 2.2-2.9. Every rule stays: the 100-line limit, the 35/35/30 targets, the Step 2.6a iteration sentence, the Jev sub-steps, and every script call. Step 2.1 is left as a numbering gap. Repin the create-spec overage. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Remove the worked blockchain-chat dialogue and its "Key UX difference" line. No step reads it; Phase 1 already states how discovery runs. Repin the create-spec overage and name every coaching cut in its dated comment. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Add Story 3 tests: the cut log marks every lean-twin change adopted (coaching) or declined with a class and cites no bytes; its hunk map covers the story diff with adopted rows only; the reduced file keeps its frontmatter, step numbers, AskQuestion blocks, script calls, keep pins, and command-structure rows; the repin comment names the cuts. Fill in the cut log's end state and hunk map. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Step 1.3 compression copied two twin edits that changed behavior: the gap list lost "dependencies", and the Critical Analysis trigger on business logic that does not match user value lost its action, "ask clarifying questions". Put both back. Repin the create-spec overage. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Story 3 invariant tests compared the live create-spec.md with start-state constants and read the historical pin map as a live authority, so a later wording-only edit would have failed them. They now compare create-spec.md at 37e097e and the end commit the cut log names: frontmatter, step numbering, AskQuestion blocks, script calls, and, at the end commit, the keep pins and command-structure rows read from that commit's pin map, eval.sh, and helper. They skip without full history. Mutation tests show each check bites. The dated-comment test now requires the Story 3 line to fall from 28652, not to equal the live entry. Update the cut log for 5536b31: rows 18 and 21 corrected, declined rows 71-73 and row 70's missing rewordings added, end state 38562 bytes and overage 13602, hunk map against the new end commit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Story 3 of 2026-10-20-shipped-command-hygiene. create-spec.md went from 53612 to 38562 bytes by removing coaching (54 adopted cut-log rows, 19 declined); KNOWN_OVER_BUDGET repinned 28652 -> 13602. 1 file created, 2 modified across the story's commits. pytest 3.9: 2774 passed, 2 skipped; bash tests: 45/45; eval.sh: 0 findings. Review: PASS after 2 iterations. Drift: Small (DEV-007, DEV-008, DEV-009); spec-lite amended. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…0-20-shipped-command-hygiene
Exit-criteria checker verdict met (implement-spec.c1-c3). Integration run after merging phase/13-subtract-and-repair: pytest 3.9 2774 passed, 2 skipped; bash tests 45/45; eval.sh 0 findings, 0 run errors. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
29 scenarios: 13 covered by committed tests, 9 partly covered, 7 by hand, including one /create-spec run on the reduced command. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Tier B leanness audit at phase close (restarted per ADR-030): commands -2,139 lines across the phase; findings routed to two new issues. Two evidence-bound lessons from the phase run: merge the phase head into a lane before integrating, and have repo-wide guard greps exclude .writ/specs as a whole. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s/ path .writ/docs ships to users, and the harness-cuts guard rejects shipped files that point at dev-only scripts by path. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… /design separate Folds in the 2026-10-21 product check: - Phase 13 is implemented, pending human UAT (unreleased); each success criterion and feature is ticked against the phase-state evidence. - The claude-agent-generator spec gets a condensed-history row. - Four design-command lines are reworded so Writ's /writ-design and Claude Code's native /design stay separate. The mission gains the matching non-goal. - mission-lite.md and context.md are regenerated. Also fixes a knowledge lesson whose text tripped the /writ-design reference gate (one pytest failure introduced at phase close), and files a bug: the install dry-run eval scenarios match the HEAD commit subject. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
This branch adopts the 2026-10-20 strategy refresh (ADR-030): Writ owns the contract, the verifier, and the boundary, and users will reach it through one front door. It then delivers Phase 13, Subtract and Repair, which fixes every defect the pstack and
/prototyperesearch found and removes what no longer earns its place before Phases 14–16 add anything. Theclaude-agent-generatorspec, built in a separate session from an issue this work filed, rides along.Breaking change:
/designis renamed/writ-design. Claude Code ships its own native/design, and the two stay separate commands; neither delegates to the other. Unmodified installed copies ofdesign.mdare removed on update, and modified copies are kept with a warning. Two cases where an old copy stays silently are listed in the spec's Upgrade Note.Changes
/prototypeexploration study.ci-and-update-integrity):.writ/docs/tech-stack.md) and stop overwriting customized files.ci-and-update-integrity):eval.ymladdspyteston Python 3.9 (viasetup-uv) and everyscripts/tests/test_*.sh, counting failures.harness-cuts):WRIT_HARNESS_LEANare deleted.recommend-state.pyand its state-format doc are dev-only (no longer shipped)./ship's description now says it opens a PR.claude-code-parity):system-instructions.md(the Prime Directive), imported from theCLAUDE.mdblock.gen-claude-md.py, and an eval check catches drift.CLAUDE.md.adapters/claude-code.mdis corrected.platform-neutral-names):/prototypenames acanvas-previewcapability, and all four adapters map it with stated degradation./design→/writ-designrename, with a reference-gate test.shipped-command-hygiene):shipped-refscheck guards this.eval.shfell from 207 to 144, with a pin map and no safety pin removed.command-structurecheck.create-spec.mdshrank from 54,264 to 38,562 bytes by removing coaching, with a cut log.claude-agent-generator):claude-code/agents/*.mdis generated fromagents/*.mdplus an overlay, with--checkand content parity.Spec Reference
.writ/specs/2026-10-20-ci-and-update-integrity/spec.md.writ/specs/2026-10-20-harness-cuts/spec.md.writ/specs/2026-10-20-claude-code-parity/spec.md.writ/specs/2026-10-20-platform-neutral-names/spec.md.writ/specs/2026-10-20-shipped-command-hygiene/spec.md.writ/specs/2026-10-20-claude-agent-generator/spec.md.writ/product/roadmap.md, Phase 13. Decision:.writ/decision-records/adr-030-contract-verifier-boundary-front-door.md.Test Results
/shipdid not run tests (use/ship --testto run the suite before the PR opens). The last local runs on this head's tree (b3ebd3d):uv run --python 3.9 pytest: 2,774 passed, 2 skippedscripts/tests/test_*.sh: 45 run, 0 failedbash scripts/eval.sh: 0 findings (therecommended-spec-implementationcheck, 147/147, was re-run after the final commit)exit-criteria.py check --command implement-phase: metThis PR is the first GitHub Actions run of the new
pytestand bash-test steps.UAT: 176 scenarios across the five Phase 13
uat-plan.mdfiles are still open, including steps that need a live Claude Code, Cursor, or Codex session. Phase 13's status is implemented, pending human validation.Drift Report
Two specs were widened at contract lock with the maintainer's approval: the
update.shdata-loss fix, andCLAUDE.mdownership on uninstall and reinstall.Review Notes
No
/reviewwas run before/ship. Every story passed/implement-story's Gate 3, from a fresh evaluator or review agent separate from the coding agent (3 stories needed 2–3 review iterations). Spec contracts were locked by the maintainer before implementation.🤖 Generated with Claude Code