Repository navigation
A dissolution condition does not authorize creating the debt (operator ruling) - #8113
Merged
Merged
Conversation
…r ruling) DESIGN §5's "the only two landing states are the real fix, or a declared scaffold" is superseded and deleted. In practice the trigger became a permit: "I know this is temporary, but I registered its future deletion, therefore it may merge." The default and expected landing state is the final construction; a scaffold is an operator-approved exception, not an ordinary alternative to it. Any PR whose current head introduces a net-new active dissolution obligation without an explicit operator verdict on that exact population is a hard reject -- marked-but-unapproved debt is refused, and unmarked debt is the same violation plus concealment. The rule follows from §2 rather than being layered on: redundant work spends someone else's future time for the author's present convenience, including by building something destined to be thrown out. A throwaway artifact costs authoring + review + maintenance + deletion + review of the deletion, against a benefit bounded by its lifetime. §5 also separates the two questions the repository was conflating. How would this temporary thing disappear is the generic lifecycle authority's; may we introduce it at all is project-level, because neither dissolution arm says the construction was justified, and std.disposition Scaffold carries a mechanism and a binding and nothing else -- no authorization, no proof the final path could not be built now, no benefit bought, no assessment of an existing modeled path. So the verdict is not a Boolean: RejectAndFinishNow (default), ApproveTemporaryIntroduction (the only arm admitting new debt), and AcknowledgePreexistingDebt, which exists so documenting previously hidden debt never reads as creating it. Approval is external to the diff. Out-of-band actuation gets no ordinary scaffold arm. A hand-authored workflow, deploy script or manual mutation path standing beside a modeled actuator is manual application committed as source; it never becomes the final path by refinement. Branch-local experimentation stays open -- run it, measure, delete before merge. Receipt: gunbc#8073. §6 replaces "every scaffold lands with a named dissolution trigger" with the external-verdict requirement, and adds intellectual sustainability with the reviewer's independent test: will this artifact survive the terminal architecture substantially unchanged, and be consumed by it? A missing dissolution condition makes the finding more severe, not less. Recurring failure modes gains self-authorized dissolution. DESIGN.md regenerated (generated_artifact_gate main_wet, PASS).
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.
Operator ruling, 2026-08-10. This is the authority half; the enforcing carrier (
gunbc.dissolution_admission) is sequenced behind #8059 — see Sequencing below.The loophole this closes
DESIGN §5 said that once an author notices a workaround, the two landing states are the real fix or a declared scaffold with a dissolution trigger. §6 said every scaffold lands with a named dissolution trigger. Together those made the trigger behave as a permit: I know this is temporary, but I registered its future deletion, therefore it may merge.
The old clause is superseded and deleted, not supplemented — leaving both would put two conflicting rules in the same document. It survives in the text only as the explicitly-quoted thing being replaced.
What the document now says
§5 — three new paragraphs.
The default and expected landing state is the final construction; a scaffold is an operator-approved exception, not an ordinary alternative to it. Any PR whose current head introduces a net-new active dissolution obligation without an explicit operator verdict on that exact population is a hard reject. Marked-but-unapproved debt is refused; unmarked debt is the same violation plus concealment. The rule is derived from §2 rather than layered on — redundant work spends someone else's future time for the author's present convenience, including by building something destined to be thrown out — so a throwaway artifact costs authoring + review + maintenance + deletion + review of the deletion, against a benefit bounded by its lifetime. If the modeled path already exists, that benefit is zero and the trigger was ceremony.
Lifecycle and admission are two questions, and the repository was conflating them. How would this disappear? belongs to the generic lifecycle authority. May we introduce it at all? is project-level, because neither dissolution arm says the construction was justified, and
std.dispositionScaffoldcarries a construction mechanism and a declaration binding and nothing else — no authorization, no proof the final path could not be built now, no benefit bought, no assessment of an already-modeled path. So the verdict is not a Boolean: RejectAndFinishNow (default), ApproveTemporaryIntroduction (the only arm admitting new debt), AcknowledgePreexistingDebt (found on the base, not created here — this arm exists so documenting previously hidden debt never reads as creating it, which is the incentive that would otherwise keep it hidden). Approval is external to the diff: an author-written flag is not approval.Out-of-band actuation has no ordinary scaffold arm. Where the final path is modeled intent → generated plan → modeled host-effect actuation and the temporary path is hand-authored YAML → embedded shell → host mutation, the temporary artifact is not an early version of the final one — it never becomes it by refinement; it is deleted whole while the real path is separately authored. Branch-local experimentation stays fully open: run the canary, take the measurements, delete it before merge. Experimental work is not valueless because its implementation is disposable; it becomes waste when the disposable implementation merges into the long-lived authority.
§6 —
every scaffold lands with a named dissolution trigger→no scaffold lands by author declaration alone, with the external-verdict requirement and the note that reviewers independently search for undeclared scaffolds, so the author's classification is evidence to inspect, never the denominator. A new intellectual sustainability bullet carries the reviewer's independent test — will this artifact survive the terminal architecture substantially unchanged, and be consumed by it? — the nine review tells, and the point that a missing dissolution condition makes a finding more severe, not less. Adding a trigger after review does not resolve the objection; it only makes the proposal eligible for a decision.Recurring failure modes gains self-authorized dissolution.
Receipt
gunbc#8073 landed three hand-authored Spark workflows beside the modeled convergence spine (
gunbc.fleet_converge_timer→gunbc.fleet_converge_apply→gunbc.host_effect_realizehost_effect_apply). One registered aScaffoldwhose own note said the construction was "exactly the class the shell → intent routing forbids" — the trigger standing in for the decision. All three deleted ind03f5b63ad; the disposition had no subject once they were gone.Sequencing — what this PR is not
This is the authority, so reviewers can apply the rule today. It deliberately does not add the gate.
The enforcing carrier is
gunbc.dissolution_admission: derive all active debt representations, compare base against head at exact subject identity, distinguish migration of existing debt from introduction of new debt, render the exact new-obligation set, refuse without a current-head operator verdict, expose unclassified candidates for reviewer inspection.std.dissolutionstays the generic, honest lifecycle authority — no operator fields go in it.It is sequenced behind #8059 because that PR owns the denominator, and a gate on an open denominator is the failure DESIGN §5 already names (completeness is an identity join, not a count). #8059's owner confirms the live-corpus join has landed on their branch (
data_decl_type_facts, parse-only fail-closed corpus walk, 16,975 data declarations over 3,475 modules, refusing rather than shrinking on a parse failure). One limitation to design around, from them:type_nameis the annotation head only, soDisposition-typed rows enumerate exactly butScaffoldis a filter step away, and the variant must not be inferred from the name.Verification
generated_artifact_gate main_wet --wet→ PASS; DESIGN.md regenerated in the same commit, never hand-edited. Source and generated output land together per the drift gate.