Preserve product intent across maintenance transitions - #192
Merged
Conversation
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
Maintenance transitions now bind the verified durable product-goal facet as preserved context. They can preserve a known goal or verified absence, but cannot invent or replace product delivery intent.
Motivating legacy-state reproduction: a TaxWeave V2 installation had verified configuration, an old runtime, and no configured product goal. The supported updater refused before admission because installation maintenance required a product goal. Supplying a synthetic bootstrap goal would have crossed the maintenance/product boundary and created false delivery intent.
Root cause
Installation, runtime, configuration, catalog, and recovery transitions shared the product-delivery goal contract. The CLI also supplied a bootstrap goal during initialization. This made product identity an accidental maintenance prerequisite and allowed installation initialization to persist synthetic product intent.
Invariant restored
Boundary: command or SDK maintenance request -> resolver/admission -> effect/recovery -> receipt/replay.
Control law: maintenance may preserve verified product-goal state but never create or replace it. Known state is bound exactly; verified absence remains absent; unknown or malformed evidence fails closed. Command-scoped product goals do not influence maintenance identity.
Authority: existing transition authority contracts remain unchanged. No provider, publication, or merge authority is added.
Implementation
optional-preservegoal scope to maintenance transition policy.goal.configurecan create product intent.Regression coverage
Locus result
Before:
drv-4ce6f9ff448933feb9a5c49fdbe58c0b60a442fb11e4cba852e2132001c6785efound the current design blocking atlegacy_goal_absentand both request/durable-goal refusal states. The bootstrap fallback reached the forbiddenproduct_goal_contaminatedstate.After:
drv-b594e51e5e6454ce9d8e767a4cb963a5c8659e39cc0cbf6cb210ce95d78ed2f4is faithful. The forbidden product-contamination state is unreachable, nonblockingness is true, and blocking states are empty. Declared-slice event completeness is discharged by the maintenance path inventory and regressions. The claim remains advisory because fresh behavior across every third-party coding-agent host is outside this run.The original TaxWeave legacy state was re-observed read-only with the patched bytes:
installation.updateisPRESCRIBED, the snapshot goal remains verifiedabsent, and the repository remains clean.Verification
python3 .github/scripts/run_go_tests.py(147 tests, 10 passing shards)go test -race ./...go vet ./...go build ./...python3 -m unittest discover -s .github/tests -p 'test_*.py'(27 passed)git diff --checkRelease note:
release-notes/2026-08-11-maintenance-goal-isolation.md.Remaining frontier
Whole-host behavior remains advisory until the released bytes are exercised from a newly loaded coding-agent task. This PR does not merge itself and does not migrate existing product goals or delivery plans.