Skip to content

docs(canon): open CHANGE-PROCEDURE step 1 for "Always leave it working" (PROVISIONAL — merging opens the proposal, does not adopt it) - #1041

Merged
hyperpolymath merged 2 commits into
mainfrom
docs/propose-always-leave-it-working
Sep 23, 2026
Merged

hyperpolymath merged 2 commits into
mainfrom
docs/propose-always-leave-it-working

Conversation

@hyperpolymath

Copy link
Copy Markdown
Owner

What you asked

"is there a way to get claude and other ais to commit to a prototyping first, then evolutionary software design methodology, so that there's almost always a working thing by the end of the week, when credit runs out, and that everything jumps in version to the next version rather than doing it all in this bitwise thing that often just cracks mid-cycle when the credit runs down. or is this a really bad thing to do that will infinitely raise the cost of the credit involved or lead to an inferior more bitty project"

The answer to the risk question, first

It lowers cost rather than raising it, and the reason is not the one you'd expect.

The dominant cost in the current mode is not the code left unwritten — it is the re-understanding after a crack. An interrupted migration forces whoever arrives next to rebuild the entire mental model from a cold start before they can safely touch anything, and that reconstruction costs more than the increment it is trying to resume. That cost is paid per interruption, not per increment. An always-working default branch therefore caps the blast radius of an interruption at one increment instead of one campaign, and makes spend predictable, which is a stronger property than merely lower.

The three names for what you described, so this is not an invention: walking skeleton (Cockburn) / tracer bullet, evolutionary design under Gall's Law, and a release train — fixed date, flexing scope, which is exactly what "jumps to the next version" means operationally.

Two risks are real, and neither is the one you feared:

  1. Prototype permanence. Evolutionary design rots when prototypes are parked rather than promoted or deleted. Contained by making promote-or-delete an obligation — and it is already governed, because an unreplaced prototype is a place the system can be wrong without saying so, which is a hole under holes before goals.
  2. Invariant inflation — the AI-specific one, and the only thing here that would genuinely inflate credit. An agent reading "a working thing every week" as "re-prove the whole estate every week" converts a cheap local invariant into an unaffordable global one. Contained by defining "working" narrowly inside the principle text itself: the default branch is green and the thing runs. Nothing more.

One genuine exclusion, and it is not a corner case here. Irreversible cutovers — a runtime swap, a format change all consumers must adopt at once, retiring a still-required gate — admit no increment that leaves both states working. They need a shim first (feature flag, strangler façade, parallel run) and the shim is the cost. The bun migration, the signing campaign and the A2ML retirement are all that shape, so this is declared up front rather than discovered halfway.

What this PR does — and deliberately does not do

You asked me to "add it to my software engineering approach document in standards and get it to be the case for all bots visiting". Two findings changed how that had to be done.

1. The document you named is downstream of the real source. RSR-PHILOSOPHY.adoc states that the full Doctrine lives in the arrival-pack and is projected from there into the top of every CLAUDE.md by just claude-md. Editing the philosophy doc alone would have been precisely the downstream symptom-patch its own §1 forbids. The real chain is arrival-pack.ncl (the Nickel projection engine) → just claude-md → every repo's CLAUDE.md, with 0-canon/RSR-PHILOSOPHY.adoc as the canonical prose.

2. Your estate has a constitution, and it gates exactly this. 0-canon/constitution/CHANGE-PROCEDURE.adoc is a six-step procedure. Steps 1–2 (open a proposal; provide human- and machine-readable impact) I can do. Steps 3–6 — review by the named constitutional authority, a meaningful contest period, the recorded decision, and regeneration of derived registries — are yours, and permanent policy may not skip them. A new principle enters as PROVISIONAL, explicitly barred from the CLAUDE.md projection until ratification is recorded.

So the honest answer to "get it to be the case for all bots visiting" is: your own constitution gates that projection on your ratification, and the draft is staged ready for it. Following the procedure is what makes the principle actually bind rather than becoming another ignored line.

file what it does
0-canon/RSR-PHILOSOPHY.adoc adds == Always leave it working, marked PROVISIONAL using the same [IMPORTANT] proposal-status block as Elegance by default, barred from projection until ratified
docs/decisions/ADR-006-always-leave-it-working.adoc the step-1 proposal record: authority affected, rationale, alternatives, compatibility, evidence status, tensions — plus the exact one-rule arrival-pack delta ratification would apply, so step 6 is a single follow-up commit
0-canon/constitution/KNOWN-TENSIONS.adoc one new contradiction row (see below)

arrival-pack.ncl is deliberately NOT edited. Adding rule 16 before ratification would repeat the exact defect this PR also records.

Merging this PR opens the proposal. It does not adopt the principle. There is nothing here to hold open — the PROVISIONAL section and the ADR are step 1, and the tensions row is a factual record. The thing that must not happen early is the arrival-pack edit, which is not in this PR.

A live governance defect found on the way, now recorded

Elegance by default is already projected as estate-common doctrine rule 15 in every generated CLAUDE.md, while 0-canon/RSR-PHILOSOPHY.adoc states it MUST NOT be until its ratification record is complete. Those two cannot both stand. AUTHORITY-AND-PRECEDENCE.adoc mandates recording a contradiction tension where requirements conflict, so that row is added. Partial containment: the whole estate-common block carries manifesto_pin = "DRAFT-unratified". The next action is binary — complete the record, or remove rule 15 and regenerate.

Two things that must be settled before ratification

  1. The Immutable-Tags deadlock. Four hyperpolymath repos carry a ruleset with the creation rule and an empty bypass_actors list, meaning no tag can be cut by anyone, you included. A version-jump obligation on those repos is unsatisfiable today. Ratification must not precede that repair (tracked as R9.2).
  2. Evidence status is assumed, not measured, and the ADR says so explicitly. The interruption-cost argument is reasoned from measured inputs (the 57%-of-open-PRs abandonment figure; this session's own compaction volume) but has not been run against a control.

Enforcement — no new mechanism is proposed

Both halves already have teeth, so inventing a hook would duplicate them: "leave it working" is enforced by the green-default-branch rulesets already armed on standards (23787415) and propagating under R5/R9; "jump to the next version" by the R9 tag floor, subject to the repair above.

Validation

  • asciidoctor -o /dev/null clean on all three files (zero warnings)
  • KNOWN-TENSIONS.adoc table verified at 6 cells per row, header included
  • commit signed — %G? = G, which matters because ruleset 23787415 carries required_signatures with current_user_can_bypass=never
  • authored from a fresh clone of origin/main, not the local working copy: RSR-PHILOSOPHY.adoc was moved to 0-canon/ and the stale local root copy (78 lines) is 59 lines behind the live file (137) and absent from origin/main. Editing it would have re-created a deleted file at a retired path and dropped the entire PROVISIONAL apparatus.

🤖 Generated with Claude Code

https://claude.ai/code/session_01YJ6PbZUYBcjJv7FTRfyogo

The owner asked whether an AI can be bound to prototype-first, evolutionary
delivery — a working thing at every budget boundary, with the version moving in
named jumps rather than cracking mid-cut — and asked, honestly, whether doing so
would inflate credit cost or produce a bittier project.

The answer is no: the dominant cost in the current mode is re-understanding after
an interruption, which is paid per interruption rather than per increment, so an
always-working default branch caps the blast radius at one increment instead of
one campaign. The two real risks are prototype permanence (contained by an
explicit promote-or-delete obligation, and already governed by "holes before
goals") and invariant inflation — an agent reading "a working thing every week"
as "re-prove the whole estate weekly" — contained by defining "working" narrowly
in the principle text itself.

This does not adopt the principle. 0-canon/constitution/CHANGE-PROCEDURE.adoc
permits steps 1 and 2 without the owner; steps 3-6 (review by the named
constitutional authority, contest period, recorded decision, regeneration) are
owed. So:

- 0-canon/RSR-PHILOSOPHY.adoc gains "Always leave it working" marked PROVISIONAL,
  using the same [IMPORTANT] proposal-status block as "Elegance by default", and
  barred from the CLAUDE.md projection until its ratification record is complete.
- docs/decisions/ADR-006 is the step-1 proposal record: authority affected,
  rationale, alternatives, compatibility, evidence status (assumed, not measured)
  and tensions — plus the exact one-rule arrival-pack delta ratification would
  apply, so step 6 is a single follow-up commit.
- The arrival-pack is deliberately NOT edited. Adding rule 16 before ratification
  would repeat the defect this PR also records.

That defect is real and now registered: "Elegance by default" is emitted as
estate-common doctrine rule 15 in every generated CLAUDE.md while the canon
states it MUST NOT be until ratified. AUTHORITY-AND-PRECEDENCE.adoc requires a
`contradiction` tension where requirements conflict, so KNOWN-TENSIONS.adoc gains
that row.

Two tensions are declared rather than hidden: irreversible cutovers (runtime
swap, format change, retiring a still-required gate) admit no always-working
increment without a shim, and the shim is the cost; and an enforced version jump
is unsatisfiable on the four repos whose Immutable-Tags ruleset carries `creation`
with an empty bypass list, so ratification must not precede that repair.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YJ6PbZUYBcjJv7FTRfyogo
@coderabbitai

coderabbitai Bot commented Sep 23, 2026

Copy link
Copy Markdown
Contributor

Warning

Review limit reached

Next included review available in 6 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used the included review currently available.

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Learn how review limits work.

Review configuration:

⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Advanced

Run ID: 34f6f350-39c9-4bf2-8f99-4d19df7c7fde

📥 Commits

Reviewing files that changed from the base of the PR and between 30815fa and fd24e74.

📒 Files selected for processing (3)
  • 0-canon/RSR-PHILOSOPHY.adoc
  • 0-canon/constitution/KNOWN-TENSIONS.adoc
  • docs/decisions/ADR-006-always-leave-it-working.adoc

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@hyperpolymath
hyperpolymath enabled auto-merge (squash) September 23, 2026 09:07
@sonarqubecloud

Copy link
Copy Markdown

@hyperpolymath
hyperpolymath merged commit 520dcf6 into main Sep 23, 2026
45 of 48 checks passed
@hyperpolymath
hyperpolymath deleted the docs/propose-always-leave-it-working branch September 23, 2026 09:08
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