Skip to content

[Spec 1280] Prompt surface: judgment not rules - #1362

Open
waleedkadous wants to merge 72 commits into
mainfrom
builder/1280-rewrite
Open

[Spec 1280] Prompt surface: judgment not rules#1362
waleedkadous wants to merge 72 commits into
mainfrom
builder/1280-rewrite

Conversation

@waleedkadous

Copy link
Copy Markdown
Contributor

Summary

Rewrites Codev's always-on prompt surface from rules to judgment (the "judgment not rules" principles P1–P7), across both trees. Ten implement phases: CLAUDE/AGENTS + skills, roles, protocol.md ×10, builder-prompt.md ×9, SPIR/ASPIR/PIR phase prompts, light-protocol phase prompts + SPIR templates, all consult-types, the scar-rule registry, and deletion of the dead porch/prompts/ tree.

Acceptance basis (charter amendment 2026-08-01): principle conformance is pass/fail; size is reporting-only. No word target was chased.

Closes #1280

Changes

  • Always-on builder surface (spir, I=10): 34,231 → 18,233 words (−47%); total authored 153,205 → 106,032 (−31%). Full report: codev/resources/1280-measurement-report.md.
  • Every capability preserved (M5) — no gate/check/signal present in the frozen Phase-0 inventory is absent post-rewrite. {{artifact_name}}, {{> }} includes, phases-JSON, VERDICT:, PR-body close-keyword heredocs, <signal> tags all survive.
  • Relocation proven (M0c) — skills grew 42→46 files (+4,516w) while everything else shrank, so the always-on drop is deletion + relocation to on-demand skills, not pure deletion.
  • Scar rules — the eight ratified canonicals kept verbatim; scar-rules.yaml rebuilt with must_appear_on re-derived against the post-rewrite surface; new T4 test enforces byte-identical carriage.
  • Six retirements (M10) — R1–R6, each with behaviour-survival analysis + a mutation-verified replacement guard, all human/architect-approved (codev/resources/1280-retirements.md). R5 removed the repo-wide manifest-completeness CI scan per Waleed's ruling (it taxed concurrent PRs).
  • Dead tree deleted (M6)codev-skeleton/porch/prompts/ (10 files, no runtime consumer).

Testing

  • packages/codev suite green: 4,184 passed / 48 skipped, deterministic.
  • Per-file guards (bugfix-685, bugfix-742, Bugfix builders notify architect before CMAP review completes #335, template-delivery, review-prompt-routing, baked-decisions, T4 scar registry) all green; each caught real regressions during the rewrite.
  • Deferred to integration (cannot run from a builder worktree): T9 live spawn probe (spawning nests builders) and full T10 rollback rehearsal (multi-commit reverts + destructive git). Group purity verified structurally.

Spec

codev/specs/1280-prompt-surface-judgment-not-ru.md

Plan

codev/plans/1280-prompt-surface-judgment-not-ru.md

Review

codev/reviews/1280-prompt-surface-judgment-not-ru.md

…/AGENTS.md to the blog principles (G2)

CLAUDE.md 5,815 -> 1,417 words; AGENTS.md byte-identical. ALWAYS_ON 34,231 ->
29,833. Acceptance is principle conformance, not size - the numbers are reported
because M0c requires deletion and relocation to be distinguishable, not because
anything passes or fails on them.

DELETED vs RELOCATED (M0c): of 4,398 words removed from always-on, 1,129 were
RELOCATED to skills and 3,269 were DELETED outright. Authored total fell only
4,294 (153,219 -> 148,925) because relocation writes to four trees - the honest
picture, and what T15 exists to expose.

Relocated (P3, P4):
- Runnable Worktrees, entire section -> NEW runnable-worktrees skill (926w):
  config block, afx dev CLI, VSCode controls, URL/cleanup semantics, 7 recipes.
  Needed rarely, loaded always.
- Local Build Testing + directory map + tokei -> codev skill (326 -> 529w).
  Includes the copy-skeleton/rebuild precondition found in Phase 0.

Both written to ALL FOUR skill trees (.claude, .codex, and both skeleton
copies). New T17 asserts parity, scoped per the plan-gate ruling to skills this
project TOUCHES - untouched drift (afx, porch) stays exempt and belongs to the
architect's separate issue.

Deleted (P1, P7): 'Before Starting ANY Task', 'When Stuck After 15 Minutes',
'Understand Before Coding' - judgment a frontier model already exercises, and
duplicated by hot-tier lessons. Duplicated scar blocks (worktree destruction x2,
afx-from-root x2, git add -A x3) each survive exactly once. CLI reference link
list, responsiveness examples, cmap walkthrough, porch command list, messaging
examples - all addressable by skill name.

Kept: all eight scar canonicals VERBATIM and unwrapped (a first draft reflowed
them across lines, which broke exact-match - canonicals must stay single-line),
the generated hot-context block byte-for-byte, repo dual nature, four-tier
resolution, deliver-don't-fetch, gate semantics, area policy, consultation
defaults including the load-bearing -sol suffix, commit formats, never-squash.

M10: NO assertions retired. spec-1273-wait-discipline-docs, governance-sweep,
framework-ref-audit and template-delivery all pass unmodified. The afx skill was
deliberately NOT touched - relocating messaging into it would oblige resolving
its pre-existing drift and propagating stale 'tick' references to adopters. The
addressing CONTRACT stayed in CLAUDE.md; it is policy, not a how-to, so P4 does
not apply. Judgment call flagged in the manifest, not made silently.

Also fixed a design flaw in my own Phase 0 test: it pinned ALWAYS_ON to a
literal, which this project changes every phase. A test edited every phase is a
test edited carelessly (M10's argument, turned on my own suite). Replaced with
arithmetic invariants that hold at any surface size, plus an immutable assertion
that the FROZEN baseline artifact still records 34,231.

Suite: 205 files, 4,083 tests, green (rebuilt first - skeleton edits are
invisible to tests until copy-skeleton reruns).
…d (G6)

2,048 -> 761 words. ALWAYS_ON(architect) 8,599 -> 2,914.

Deleted (P4): afx/porch/consult command blocks and the 14-row Quick Reference.
Each CLI has a skill that is the single owner of its flags, and the role doc had
become a stale second copy - it still advertised 'porch approve <id>
spec-approval' without the --a-human-explicitly-approved-this flag the command
now requires. A second owner of command syntax is a drift generator.

Deleted (P1/P7): step-by-step 'Starting a New Feature' / 'Monitoring Progress' /
'Cleanup' walkthroughs (sequenced narration of three commands - the obligations
survive as contract lines), and the Release Management state diagram
(aspirational, no mechanism behind it in this repo).

Kept: risk-triage table with highest-factor-wins precedence, the PRFT contract
for presenting decisions to the human, UX verification, all boundaries, and the
afx-from-root scar canonical VERBATIM.

Verified rather than assumed, per the plan's open question: architect.md carries
NOTHING load-bearing for multi-architect coordination (Specs 755/786/823) -
grepped for architect:<name>, sibling/multi-architect language,
spawnedByArchitect and whoami, zero matches. That contract lives in CLAUDE.md.

Group-pure commit: G6 only.
…(G3)

1,837 -> 849 words. SPIR builder spawn 6,364 -> 5,371.

Deleted (P1/P7): the numbered Core Loop, 'What You DON'T Do in Strict Mode', the
'Getting Started' 3-step list, and the duplicated protocol summary (the protocol
is inlined into the spawn prompt - restating it here was a drift-prone second
copy). ALL-CAPS repetitions collapsed so each prohibition appears exactly once.

Kept: mode contract, gate semantics, deliverables, thread contract, notification
triggers, wait discipline, worktree path discipline, scope, flaky-test rule, and
the no-hand-edit-status canonical VERBATIM.

M10 - NO assertions retired. spec-1273-wait-discipline-docs.test.ts (18
assertions across both role-doc copies) passes UNMODIFIED. Three initially
failed against my rewrite:
- '## Waiting on external work' heading - I had renamed the section
- 'never chain foreground poll loops' - a LINE WRAP split the phrase
- 'queues unread until your current turn ends' - I had dropped 'current'

In all three the BEHAVIOUR survived; only the strings moved. I adjusted my prose
rather than the assertions: those strings encode a wait-discipline incident,
preserving them cost nothing in conformance, and editing a prior spec's
protection to fit new prose is exactly the silent erosion M10 exists to prevent.

Third occurrence of the wrap hazard (scar canonicals in Phase 1, test assertions
here): reflowing prose breaks any exact-match string that spans a wrap. Verify
after rewriting; keep canonicals on one line however long.

Group-pure commit: G3 only.
roles/consultant.md inspected and left UNCHANGED (G5, no commit needed): already
conformant - it states a contract, not a procedure. Under the acceptance model a
conformant file passes as-is; shrinking it further would be size-chasing, which
the charter amendment explicitly rejects.

Suite: 205 files, 4,083 tests, green.
…relay-shaped (G6)

Architect inspection caught a cross-file contradiction my rewrite half-fixed.
builder.md correctly encodes the relay convention ('Approval reaches you as a
message from the architect. Then YOU run porch approve; the architect does not
run it for you') - but architect.md kept the OLD worked example showing the
ARCHITECT running (cd .builders/<id> && porch approve ...). The two roles
disagreed on who the approval actor is.

builder.md was the correct one: it matches the owner's standing convention -
the architect relays the human's word, the builder runs porch approve itself.
It is also what actually happened twice in this project's own gates, so the
architect.md example contradicted observed behaviour.

This is the SAME stale-second-owner class I had just caught on the porch-approve
flag syntax, one level up - and I introduced it by fixing one owner and leaving
the other. Worth recording: catching a class of defect is not the same as being
immune to it.

Gates section now: read the artifact, decide, relay via afx send; the builder
executes against its own porch state. Kept the --a-human-explicitly-approved-this
explanation because the WHY is load-bearing - a gate message is a notification TO
a human, never a token an agent may spend on its own authority.

afx-from-root canonical re-verified verbatim after the edit (the reflow hazard
applies to every rewrite, including fixes). Twins identical. 51 tests green
across the wait-discipline, skills-parity, governance-sweep and
framework-ref-audit suites.

Group-pure commit: G6 only.
…builder/1280-rewrite

# Conflicts:
#	packages/codev/src/__tests__/spec-1280-measurement-instrument.test.ts
# Conflicts:
#	packages/codev/src/__tests__/spec-1280-measurement-instrument.test.ts
… the P6 include mechanism (G3)

Ten decisions, both trees. ALWAYS_ON 28,844 -> 26,384; TOTAL_AUTHORED
144,465 -> 126,155. spir 3,699 -> 671 authored (1,239 served).

P6 MECHANISM: each protocol.md carries a fenced json block containing
{{> protocols/<p>/protocol.json}}. Verified rather than assumed:
resolveCodevIncludes is extension-agnostic, and spawn-roles.ts:127 passes
protocol.md through the same resolver before inlining it as
{{protocol_reference}} - so strict AND soft mode both get the structured source.

New T18 asserts delivery in both modes, which are NOT symmetric: strict-mode
builders also receive gates/checks as porch task JSON, but soft-mode builders
have ONLY this document. A silent expansion failure would leave them with a
protocol doc describing nothing.

RESOLVER MODEL CORRECTED, found by writing T18: tier 4 is getSkeletonDir() - the
INSTALLED NPM PACKAGE - not <root>/codev-skeleton/. The repo-local
codev-skeleton/ is a build source (copy-skeleton copies it into
packages/codev/skeleton); the resolver never reads it. My first fresh-install
test planted files in a temp codev-skeleton/ and 'passed' against the real
installed package. Rewritten to assert the actual adopter guarantee: skeleton is
in the npm files allowlist and every P6 protocol's protocol.json is in the built
skeleton.

release/protocol.md INSPECTED AND UNCHANGED: no protocol.json so P6 does not
apply, and 36% of it is exact commands (git add file lists, the version-anchor
pattern, the pre-release VSCode auto-skip, the backport path) where the sequence
IS the contract. A conformant file passes as-is.

CAPABILITY LOSS I INTRODUCED AND THE TESTS CAUGHT - 37 failures, all repaired,
zero assertions retired:
- #1279 (12): I replaced maintain/spike/experiment's TEMPLATE includes with the
  protocol.json include instead of carrying both, orphaning maintenance-run.md,
  findings.md and notes.md. Builders would have stopped receiving those artifact
  structures. All three restored alongside the JSON.
- Spec 746 (24): Baked Decisions shortened in SPIR and dropped from ASPIR/AIR,
  losing the category hints, the amend/rescind escape hatch, and 'absence is the
  no-op default'. That last one invites a builder to invent constraints where the
  architect deliberately left them open. Restored in full.

Suite: 206 files, 4,117 tests, green - verified after the repairs, not before.
…uously

TWO FIXES, one format decision and one root cause.

FORMAT DECISION (mine to make, per the architect): the parser learns brace
notation. The plan's inspection model is per DECISION, not per file — twins are
byte-identical and T7 verifies the sync mechanically, so the architect reads ~66
decisions rather than 131 diffs, and the <=12 batch cap counts decisions. One
manifest row naming both tree paths is therefore the correct semantics; the
parser had to understand it or the skeleton twins read as uninspectable, which
is exactly what it reported. Chose this over splitting rows because splitting
would have broken the cap and silently abandoned the per-decision model.

ROOT CAUSE of my false green: T16 diffed origin/main...HEAD, which sees only
COMMITTED work. I ran the full suite BEFORE committing Phase 3, so the test
found no changed prompt files and passed VACUOUSLY — I then reported '4,117
green' for a state that did not contain the rewrite. The test was correct both
times; my run measured a tree that no longer existed by the time I claimed it.

Now considers committed AND working-tree changes, so a pre-commit run cannot be
vacuously green. A guard that passes because it looked at the wrong tree is
worse than no guard: it manufactures false confidence precisely when the work is
unreviewed.

Mutation-verified rather than assumed: removing the spir row from the manifest
makes it fail; restoring it makes it pass. After a vacuous pass I am not
accepting a green tick as evidence that a guard bites.
…md x9 + scope T16 to this project (G3)

Nine prompts rewritten, both trees. Dropped what roles/builder.md now owns
(flaky tests, multi-PR mechanics, Getting Started, the ALL-CAPS restrictions
block); kept every protocol-specific section.

KEPT DESPITE DUPLICATING THE ROLE DOC - the Verify Phase. roles/builder.md
mentions 'verify phase' only inside a notification string; it does NOT carry the
mechanics. Deleting it here would have repeated precisely the bug Spec 1252
found, where the served SPIR builder prompt had silently lost that entire
section. Checked before deleting rather than after.

TWO PROTECTIONS KEPT RATHER THAN RETIRED:
- #744: all four asserted PR-strategy phrases preserved verbatim.
- #619: my first draft replaced 'Follow the ASPIR protocol' with a template
  variable, breaking it. The original bug had the ASPIR prompt telling builders
  to follow SPIR - wrong gates entirely. Restored, plus the symmetric line in
  SPIR, because #619 was a CROSS-protocol mixup and symmetry makes it harder to
  reintroduce in the other direction.

M10: ONE RETIREMENT PROPOSED, NOTHING RETIRED UNILATERALLY. R1 in
codev/resources/1280-retirements.md - the pre-746 pure-addition baselines, which
this project's deletions make permanently unsatisfiable. Re-baselining is NOT
the escape: 746's own pollution check requires the baseline to lack '## Baked
Decisions', so a re-baselined file fails it, and silencing that check would gut
the anti-vacuity property. 746's substance survives and still passes. Replacement
implemented but inert pending approval.

T16 SCOPED TO THIS PROJECT - second cross-project firing of my own guards, and
worse than the first. Its predicate was repo-global: any prompt-bearing path in
origin/main...HEAD had to appear in a 1280 manifest. Living in the shared suite,
it fired on Spec 1307, which would have had to file paperwork in MY project
directory to go green. A guard that taxes work it does not govern is broken
however well it protects its own project.

Fixed by provenance, not paths: only files touched by commits tagged [Spec 1280]
on this branch are this project's to document; any other branch skips entirely.
The uncommitted-changes check is retained so a pre-commit run still cannot pass
vacuously.
…rompts (Spec 746)

Architect-approved 2026-08-01. Retires exactly three expectPureAdditionDiff
instances — codev/protocols/{spir,aspir,air}/builder-prompt.md — and nothing else.

ORIGINATING SPEC: 746 (Baked Architectural Decisions). Its baseline is the
PRE-746 file, so the assertion proved 746's paragraph was ADDED without
destroying prior content.

APPROVAL GROUNDS, as given by the architect:
1. The invariant is construction-time scaffolding that hardened into a
   change-freeze. It proved non-destructive addition AT THE MOMENT OF ADDITION,
   but as a standing assertion it forbids any future deletion-rewrite of those
   files forever - which is not a behaviour 746 ever claimed to protect.
2. Spec 746's actual protection survives in assertions that still pass
   unmodified: the Baked Decisions sections present and substantive in all three
   prompts and both trees, plus the anti-vacuity pollution check.
3. The analysis that re-baselining guts the anti-vacuity half is verified sound,
   so retirement-with-trace is strictly more honest than the silent re-baseline
   a less careful builder would have shipped.

NOT RETIRED: the identical guards over PHASE_2_FILES (drafting prompts) and
PHASE_3_FILES (reviewer prompts) remain in force. The pollution check - the half
that stops a future builder silently re-baselining the guarantee away - is
untouched and still passing.

1280-retirements.md carries the per-assertion behaviour-re-asserted mapping
naming the surviving test for each, so a future reader can check the claim
rather than trust it.

It also corrects an overstatement of mine: an earlier revision described the
replacement guard as 'implemented, inert until approved'. It was not implemented,
only designed. The architect read that file before approving, so the correction
is recorded rather than quietly fixed. The replacement ships as its own commit.
…ection

Ships separately from the retirement, per approval condition 3.

R1 retired the pure-addition diff against PRE-746 baselines because it forbade
any future deletion-rewrite forever. The protection worth keeping is narrower and
survives rewrites: once this project has finished rewriting a prompt, LATER edits
must not silently delete from it. Same machinery, re-anchored on post-1280
baselines.

ANTI-VACUITY, INVERTED: 746's pollution check asserted its baseline did NOT
contain '## Baked Decisions', proving the baseline predated the edit it verified.
The equivalent here runs the other way — the post-1280 baseline MUST contain it.
If a future edit strips 746's content and someone re-baselines to hide it, the
new baseline lacks the heading and this fails. Without that, re-baselining would
silently launder a deletion: exactly the failure mode R1's analysis identified
and declined to ship.

MUTATION-VERIFIED BOTH WAYS rather than assumed green:
- deleting a line from a guarded prompt -> fails (deletion guard + twin parity)
- laundering that deletion by re-baselining -> fails (anti-vacuity)
- restored -> 12 pass

Also asserts skeleton-twin parity, so a fix applied to one tree cannot pass while
the other drifts.
…the Phase 5 constraint it implies

Architect found it at inspection; verified independently before recording.

PIR builder-prompt: 2 {{artifact_name}} references before, 0 after. That resolves
#1293's blank-filename symptom by deletion, and verification shows why the bug
existed: porch substitutes artifact_name at commands/porch/prompts.ts:102 when
building a PHASE prompt, but the spawn path never substitutes it (grep of
spawn-roles.ts returns nothing). A placeholder in a builder-prompt could only
ever render empty.

#1293 should close against this merge rather than lingering fixed-but-open.

CONSTRAINT FOR PHASE 5: the same placeholder is legitimate and load-bearing in
phase prompts - 51 references across the eleven targets - and deleting it there
would break artifact naming. The rule is positional, not textual: remove it from
spawn-time prompts, preserve it in porch-substituted phase prompts.
Resume state written to codev/state/spir-1280_RESUME.md (gitignored, local to the
persistent worktree - which is where it belongs; it is scratch for the next
session, not a cohort artifact).

Phases 0-4 inspected PASS. Phase 5 next: phase prompts spir/aspir/pir, 11
decisions.

Key carry-forward: {{artifact_name}} is POSITIONAL. Removing it from
builder-prompts fixed #1293; removing it from phase prompts would break artifact
naming (porch substitutes at prompts.ts:102, 51 references across Phase 5's
targets).

Also flagged: porch's plan-phase pointer still reads phase_0_instrument because
phases have been gated by architect inspection rather than porch done. Needs an
architect decision, not a status.yaml hand-edit.
…5 current

Phases 0-4 were gated by architect inspection rather than 'porch done', so
the plan-phase pointer had drifted to phase_0_instrument. Waleed authorized
this hand-edit to bring it to phase_5_prompts_heavy (the phases were verified
complete out-of-band; this only reconciles the tracker).
…measured baselines, constraints re-confirmed)
…ces (G4)

experiment/notes, spike/findings, maintain/{maintenance-run,audit-report}: annotated-example
filler -> heading interfaces. maintain/lessons-learned inspected conformant, unchanged.
Preserved maintenance-run's delivery-checked headings (# Maintenance Run NNNN, ## Audit
Findings, ### Dependencies Cleaned) and the experiment/spike include wiring. audit-report +
lessons-learned stay codev-local (no skeleton twin).
5 consult-types, both trees. Rubric prose -> lean focus-area contracts. Kept the VERDICT
capability exactly (consult parses it; pr-review keeps PR_SUMMARY), the SPIR-specific
Spec-Adherence/Scoping sections that keep impl/pr-review distinct from BUGFIX (#742), and
the Baked Decisions sections (canonical tokens) in spec/plan-review. P6 fix on spec-review:
replaced the stale hardcoded 20-heading spec-template list (broken by Phase 6's spec.md
rewrite) with a reference to the delivered template. spec/plan-review trip Spec 746 Phase 3
pure-addition -> retired under R4 (class pre-approved) in the next two commits.
…w (first PHASE_3 files)

Class pre-approved (1280-retirements.md). Phase 7's P1/P2 rewrite deletes pre-746 rubric
prose from the two spir consult-types, so their pure-addition invariant is false by design.
Behaviour survives (Phase 3 grep passes on canonical Baked Decisions wording); the other
four PHASE_3 files (aspir spec/plan-review, air impl/pr-review) verified still in force.
Replacement guard in the next commit. Includes the phase-7 manifest.
…pir spec/plan-review

Re-anchors the retired R4 pure-addition guard on post-1280 baselines of the two spir
consult-types, inverted anti-vacuity (baseline MUST contain 'Baked Decisions'). Mirrors
R1-R3. Mutation-verified both ways.
…n (T16)

Waleed's ruling 2026-08-06. The completeness scan lived in the shared suite and ran a repo
diff + git status on every PR; even scoped by [Spec 1280] provenance its uncommitted-file
check caught Mohid's #1330 (which had to strip CLAUDE/AGENTS edits to pass CI) — the second
cross-project misfire (Spec 1307 was first). What survives: the manifests, the M11 human
inspection contract, and the manifest FORMAT checks (four-fields, batch-cap) which read only
1280's manifest dir. Only the CI tripwire is gone. Also cleaned the audit-report manifest row
so its path parses. R5 writeup in 1280-retirements.md.
… P1/P2 (G5)

9 decisions, both trees. aspir x5 mirror the new spir consult-types (they were byte-identical
to the old spir versions). air x2 rewritten keeping AIR framing + Baked Decisions. bugfix x2
light touch (decapped CRITICAL, tightened) keeping the #742 Out-of-Scope core + all markers,
still differing from SPIR. VERDICT capability preserved in all nine. aspir spec/plan-review +
air impl/pr-review trip Spec 746 Phase 3 pure-addition -> retired under R6 (class pre-approved)
in the next two commits. Manifest: phase-8-consult-types-a.md.
Class pre-approved. aspir spec/plan-review + air impl/pr-review rewritten in Phase 8 delete
pre-746 rubric prose. After R4+R6 every PHASE_3 pure-addition guard is retired; the loop keeps
a documenting test so it re-activates for a future PHASE_3 file. Behaviour survives (Phase 3
grep green). Replacement guard next commit.
…spir/air consult-types

Re-anchors the retired R6 pure-addition on post-1280 baselines of aspir spec/plan-review +
air impl/pr-review, inverted anti-vacuity. Mirrors R1-R4. Mutation-verified both ways.
…1/P2 (G5, batch A)

4 decisions, both trees. maintain impl/pr-review mirror the new spir versions (they were
byte-identical to old spir). pir impl/pr-review rewritten keeping PIR-specific context
(dev-approval gate, plan adherence, review-file quality, single-pass max_iterations:1).
VERDICT capability preserved in all four. Not baked-decisions files — no retirement.
…nt (G7)

scar-rules.yaml rebuilt from the Spec 1252 registry: 8 canonicals kept byte-identical,
must_appear_on RE-DERIVED against the post-1280 surface (the P1/P4 rewrites removed the
git-add prohibition from most prompts — roles/builder.md owns it now — and the dead
porch/prompts tree is going; the old lists were stale). All eight survive on CLAUDE.md +
AGENTS.md. T4 (spec-1280-scar-rules.test.ts) pins the count at 8 + the ids, enforces
byte-identical carriage on every listed surface (rewording fails), and checks the
primary-surface guarantee. Mutation-verified: reword fails, delete fails.
… tree (M6, G4)

The 10-file Ralph-SPIR-era prompt tree with no runtime consumer — the live resolver
(porch loadPromptFile, resolveCodevFile) loads protocols/<p>/prompts/. M6-verified by an
untruncated repo-wide search: the only porch/prompts references are the code module
porch/prompts.ts (unrelated), historical project docs, and the measurement script's DEAD
bucket (now computes 0). Updated review-prompt-routing.test.ts (Spec 987): its routing check
on the deleted porch/prompts/review.md is removed; the live prompts/templates are unaffected.
…ication

Post-rewrite measurement vs Phase-0 baseline: ALWAYS_ON (builder spir I=10) 34231->18233
(-47%), architect 8599->2960 (-66%), TOTAL_AUTHORED 153205->106032 (-31%). M0c relocation
proven: skills grew 42->46 files (+4516w) while everything else shrank, so the always-on
drop is deletion + relocation, not pure deletion. M5: no gate/check/signal present in
Phase-0 served prompts is absent post-rewrite (extract-capability-inventory.sh vs frozen).
'Trust the authoritative source, not the convenient signal' — the hot-tier principle
(summaries are evidence, not ground truth) already covers it, so the concrete Spec 1280
instance catalog + the two mechanical corollaries (commit->run->read->claim quoting the SHA;
mutation-test guards both ways) go to lessons-learned.md (cold), respecting the hot cap.
…ates

SPIR review for the whole 1280 project. Documents P1-P7 conformance, M5 capability
preservation, the six retirements (R1-R6), the measurement (-47% always-on, -31% total),
and flags T9 (spawn probe) + full T10 (rollback rehearsal) as integration-time steps that
cannot run from a builder worktree. ## Architecture Updates + ## Lessons Learned Updates
present for the porch review checks.
@waleedkadous

Copy link
Copy Markdown
Contributor Author

Architect Integration Review

Remarkable project — the −47% always-on surface with every M5 capability guard green, the relocation-not-deletion proof via the total-authored metric, and six retirements each carrying human approval + mutation-verified replacement guards is governance discipline at its best. Ran a 2-way CMAP (codex REQUEST_CHANGES / claude COMMENT, both HIGH confidence) and verified every finding against the worktree myself. Claude's lane independently confirmed the highest-risk items: relocated skills reach existing adopters via copySkills(skipExisting:true) backfill, all includes resolve, all 36 consult-types keep VERDICT, and the pir/protocol.md <signal> removal is safe.

I'd like to see four changes before merge — all small:

  1. Merge ownership contradicts across surfaces. roles/architect.md says "builders merge their own" (house practice — correct), but spir/prompts/review.md:79 (and its aspir twin) says "do not merge your own PR (the architect integrates)". Reconcile to: builder merges after the human-approved gate.
  2. Gate ownership needs scoping, not reversal. Your builder.md change ("you run porch approve; the architect does not run it for you") correctly matches current practice — but PIR's surfaces deliberately route the approve command to the human. One scoping clause in builder.md (defer to your protocol's prompts on who types it) resolves the collision for PIR builders.
  3. RESEARCH's authored and structured contracts disagree: protocol.json runs ["codex"] for investigation while protocol.md promises three independent models. Reconcile whichever direction is true (if codex-only reflects the agy/hermes reality, say so in the .md).
  4. CLAUDE.md:182-186 names team and forge skills that don't ship (known Skills trees have pre-existing drift: afx/porch differ repo-vs-skeleton; forge, skill-creator, team absent from the skeleton entirely #1318 drift) — the new prose turns a passive gap into an active false claim for adopters. Drop the two names or gate on Skills trees have pre-existing drift: afx/porch differ repo-vs-skeleton; forge, skill-creator, team absent from the skeleton entirely #1318.

Ruled on the deferrals (codex wanted them blocking; I don't): T9 live-spawn and full T10 rollback rehearsal run at integration exactly as your review documents — a worktree structurally can't run either (spawn-nesting scar; destructive multi-commit git). They will run at local-install time alongside 1307's verify probes, before any release ships this. Non-blocking follow-ups to file: release/protocol.md staleness (bats tests/e2e/), and the maintain/templates two-tree divergence claude flagged.

The replacement-guard-recreates-a-freeze critique (codex) I'm treating as accepted-by-design: the freeze now ships with its documented retirement path, which is the difference the whole register exists to make.

1. Merge ownership: spir/aspir review.md said 'do not merge your own PR (architect
   integrates)', contradicting roles/architect.md. Reconciled to 'merge your own PR only
   after the human approves the pr gate'.
2. Gate ownership scoping: builder.md's 'you run porch approve' now defers to the protocol's
   prompts on who types it (PIR routes it to the human reviewer).
3. RESEARCH json/md reconcile: protocol.json runs models=['codex'] for investigation while
   the prose promised three; the prose now defers to the embedded state machine as
   authoritative and states the current reduced reality (agy/hermes lanes degraded).
4. CLAUDE.md/AGENTS.md dropped the team + forge skill names (don't ship — #1318 drift), so
   the new prose stops making an active false claim to adopters.

CLAUDE==AGENTS byte-identical preserved; scar T4 + bugfix-685 + managed-block green.
Main moved during the pr-gate wait (GitHub Actions outage). Only conflict: CLAUDE.md +
AGENTS.md — main made build-detail edits to the verbose sections that Spec 1280 deliberately
deleted (P3/P4 relocation to the codev skill). Resolved by taking the 1280 rewrite for both;
main's edits are to content the rewrite relocated, so nothing substantive is lost. All other
of main's changes auto-merged.

# Conflicts:
#	AGENTS.md
#	CLAUDE.md
@waleedkadous waleedkadous reopened this Aug 7, 2026
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.

Prompt-surface judgment rewrite: acceptance = blog-principles conformance per file (size is reporting-only)

1 participant