Skip to content

feat!: Phase 13 — subtract and repair, with the ADR-030 strategy refresh - #60

Merged
sellke merged 126 commits into
mainfrom
phase/13-subtract-and-repair
Oct 21, 2026
Merged

sellke merged 126 commits into
mainfrom
phase/13-subtract-and-repair

Conversation

@sellke

@sellke sellke commented Oct 21, 2026

Copy link
Copy Markdown
Owner

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 /prototype research found and removes what no longer earns its place before Phases 14–16 add anything. The claude-agent-generator spec, built in a separate session from an issue this work filed, rides along.

Breaking change: /design is renamed /writ-design. Claude Code ships its own native /design, and the two stay separate commands; neither delegates to the other. Unmodified installed copies of design.md are 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

  • Strategy and product docs:
    • ADR-030, with ADR-025's signal emission retired and ADR-029's review trigger amended.
    • Mission and roadmap refreshed: Phases 13–16 committed, Phase 13 marked implemented pending UAT.
    • New non-goal: Writ is not a wrapper over platform design tools.
    • Research: the pstack comparison and the /prototype exploration study.
  • Install and update keep user files (ci-and-update-integrity):
    • Manifests record baselines only for shipped paths, so updates stop deleting files the user wrote (for example .writ/docs/tech-stack.md) and stop overwriting customized files.
    • Kept stale files are warned about on every run.
    • The Codex config baseline survives.
    • Legacy manifests are repaired.
  • CI (ci-and-update-integrity): eval.yml adds pytest on Python 3.9 (via setup-uv) and every scripts/tests/test_*.sh, counting failures.
  • Cuts (harness-cuts):
    • The five lean command siblings and WRIT_HARNESS_LEAN are deleted.
    • The ADR-025 no-op emit lines are removed.
    • recommend-state.py and its state-format doc are dev-only (no longer shipped).
    • /ship's description now says it opens a PR.
  • Claude Code parity (claude-code-parity):
    • Installs carry system-instructions.md (the Prime Directive), imported from the CLAUDE.md block.
    • The block is generated by gen-claude-md.py, and an eval check catches drift.
    • Uninstall and reinstall remove or merge only the Writ block and never delete or overwrite the user's CLAUDE.md.
    • adapters/claude-code.md is corrected.
  • Platform-neutral names (platform-neutral-names):
    • /prototype names a canvas-preview capability, and all four adapters map it with stated degradation.
    • The /design → /writ-design rename, with a reference-gate test.
  • Shipped command hygiene (shipped-command-hygiene):
    • Shipped commands no longer link Writ's own ADRs, archived specs, research, or calibration records; a new shipped-refs check guards this.
    • Command-file literal pins in eval.sh fell from 207 to 144, with a pin map and no safety pin removed.
    • Converted pins live in a new command-structure check.
    • create-spec.md shrank from 54,264 to 38,562 bytes by removing coaching, with a cut log.
  • Claude agent generator (claude-agent-generator): claude-code/agents/*.md is generated from agents/*.md plus an overlay, with --check and content parity.
  • Records:
    • Five UAT plans (176 scenarios).
    • The Phase 13 leanness audit.
    • Two knowledge lessons.
    • Thirteen issues filed for out-of-scope findings.

Spec Reference

  • Phase 13 specs:
    • .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
  • Inter-phase: .writ/specs/2026-10-20-claude-agent-generator/spec.md
  • Roadmap: .writ/product/roadmap.md, Phase 13. Decision: .writ/decision-records/adr-030-contract-verifier-boundary-front-door.md.

Test Results

/ship did not run tests (use /ship --test to 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 skipped
  • scripts/tests/test_*.sh: 45 run, 0 failed
  • bash scripts/eval.sh: 0 findings (the recommended-spec-implementation check, 147/147, was re-run after the final commit)
  • exit-criteria.py check --command implement-phase: met

This PR is the first GitHub Actions run of the new pytest and bash-test steps.

UAT: 176 scenarios across the five Phase 13 uat-plan.md files 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

Spec Small Medium Large
ci-and-update-integrity 8 1 (DEV-007, resolved by recode) 0
harness-cuts 8 1 (DEV-005, superseded by DEV-009) 0
claude-code-parity 13 0 0
platform-neutral-names 5 1 (DEV-004, resolved as audited challenge CHAL-2) 0
shipped-command-hygiene 9 0 0
claude-agent-generator 6 0 0

Two specs were widened at contract lock with the maintainer's approval: the update.sh data-loss fix, and CLAUDE.md ownership on uninstall and reinstall.

Review Notes

No /review was 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

sellke and others added 30 commits October 19, 2026 16:46
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>
sellke and others added 29 commits October 21, 2026 10:29
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>
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>
@sellke
sellke merged commit 941e91b into main Oct 21, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant