Repository navigation
Reconcile's three exit codes, and a bare writ deploy that deploys the implicit set - #954
Merged
Merged
Conversation
added 3 commits
September 24, 2026 22:14
…, 1 drifted Reconcile is valid only after a deployment, and its exit status is the answer a script gates on the way it gates on git diff --exit-code. BuildReport codes the fold's not-found as ExitNoInput (66): the code is assigned in the reader that answers the question, not in the fold, because deploy's pre-flight reads the same not-found as "nothing to conflict with". The report gains HasDrift and DriftCount over the four drift words; runReconcile emits the report under every --output, then returns ExitError (1) with a one-line count when any entry is absent, changed, dangling or stale. The store's health findings are its self-report, not drift, and leave the code at 0. The tests carry the contract: the unit test asserts 66; the deploy scenario asserts 66 on an empty store and 1 after a removed link with the report still on stdout; the layer journey's reconcile helper asserts on every call that the code is 1 exactly when the entries hold drift. Proven on danoble-ud24-1 (linux/arm64) and danoble-wd11-3 (windows/arm64): 0 clean, 66 on a fresh store, 1 with the report naming the removed link. The two design pages and their status files carry the numbers; 5.1's "At reconcile" item drops the retired words fresh, modified and conflicting for the six. The manage-environments guide is rewritten in full to the six words and the current option set (ruled 2026-09-24): writ inspect and the decommission state-file table are gone, adopt is spelled by --project, reconcile carries the codes. writ decommission's help drops an example for a --force flag it does not define. Part of #916, lane 4. Closes with PR B. Claude-Session: https://claude.ai/code/session_01SqQVFZz7AdiLZkGoAcUqRW
…project per layer repository, and what the record holds The argument requirement on deploy goes (#843). A deploy's selection is resolved in one place, resolveSelection, by how each project got in (#850): implicit, which is common and one project per configured layer repository named for the repository's root directory; recorded, every project the current record holds, so a project named once stays selected wherever it put a file (ruled 2026-09-26: the record is the selection, no list of its own); named, the command line. A name no registered layer carries is refused at 64 with the name. Upgrade selects the same way; decommission stays explicit. The deploy narrates the selection by kind before it plans. Lanes 9 and 10 land together because the layer journey's probe reads the refusal's absence as the ruled form: the shim that named the implicit set is gone, the journey deploys bare, and step 2.6 -- a bare deploy keeps a named project -- runs for the first time. The deploy scenario opens with a bare deploy. Proven on danoble-ud24-1 (linux/arm64) and danoble-wd11-3 (windows/arm64): the implicit set narrated, reconcile 0, an unknown name 64, and on wd11 the bare deploy is the ruled restore that put the nine noblefactor-ops links back in the record. The command-line design's deploy row and the three guides state the rule; withCommonProject keeps the zero case as common alone, which the selection builds on. Part of #916, lanes 9 and 10. Closes with PR B. Claude-Session: https://claude.ai/code/session_01SqQVFZz7AdiLZkGoAcUqRW
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
PR B of #916, the writ lifecycle schedule: lane 4, and lanes
9 and 10 pulled ahead on 2026-09-24 because no deploy runs anywhere until the bare form works.
deployed, 0 clean, 1 drifted, gateable like
git diff --exit-code.BuildReportcodes the fold's not-found; thereport gains
HasDriftandDriftCount; the command renders the report under every--outputand then exits 1with a one-line count. Health findings are the store's self-report and leave the code at 0. The two design pages
carry the numbers, and the manage-environments guide is rewritten in full to the six words and the current option
set (ruled 2026-09-24):
writ inspectand a decommission state-file table that never existed are gone.writ deploy(#843) — the argument requirementgoes; the zero case is
common, which the issue's premise had wrong (withCommonProjectreturned an emptyselection unchanged).
resolveSelection, oneplace, three kinds: implicit (
commonand one project per configured layer repository, named for its rootdirectory), recorded (every project the current record holds; ruled 2026-09-26, the record is the selection and
there is no list of its own), named (the command line; a name no registered layer carries is refused at 64).
Upgrade selects the same way; decommission stays explicit; the deploy narrates the selection by kind. The layer
journey's shim is gone: it deploys bare, and step 2.6 runs for the first time.
Lanes 9 and 10 share a commit: the journey's probe treats the bare form and the implicit projects as one change.
Evidence
Each lane ran on both VMs, snapshotted first; raw logs under
build/e2e/756-e2e-*.logand850-e2e-*.login theworktree.
danoble-ud24-1.locallinux/arm64danoble-wd11-3.localwindows/arm64absent, also under-o noneand--silent; 0 after a redeploywrit deploy commonrun at 13:20Z had left outside the record, restored by lane 10's bare deployProjects: common, noblefactor-ops, devlore-cli, Personal (implicit); 172 files; reconcile 0; record common 70 + noblefactor-ops 102;nosuchprojectrefused 64; a plain bare redeploy accepted everything as writ's ownLocally:
make checkandmake test-scenariogreen on every lane, the layer journey with an empty skip list onits ruled steps. Coverage total 63.3%;
reconcile86.2%; the selection's functions 80–100%. Nothing new overcomplexity 8. Size: +660 −215 across the changed files against develop.
Found, for placement: a path-registered layer contributes its directory's name, so
~/Workspace/Personalyieldsthe implicit project
Personal, and aHome/personalproject would not be implicit on a case-sensitive filesystem.The rule stands as ruled; whether the name should come from the remote is the owner's call.
Test plan
make check,make test-scenario, per lanewrit deploy --allow-dirty --conflict=replaceon this MacCloses #756
Closes #843
Closes #850
Time
Computed by the algorithm of noblefactor-ops#188 at merge.
https://claude.ai/code/session_01SqQVFZz7AdiLZkGoAcUqRW