Conversation
…eady had (#47) `cxc --help` points at the sibling commands, and following that pointer failed: --help was reported as an unknown verb on loop, scan and receipt, and `cxc --version` was an unknown command. orchestrate was fixed for exactly this in 260709_cxc_help_agent_ux; its siblings never were. The cost is not the error messages, which are individually fine. It is that discovery was only available through failure. Arming a goalplan in this session took six consecutive rejections to assemble one correct command: loop steer: --session <id> is required loop steer: --batch-json <path-or-json> is required loop steer: idempotencyKey is required and must be a non-empty string loop steer: rationale is required and must be a non-empty string loop steer: evidence is required and must be a non-empty string loop steer: ops must be a non-empty array help | --help | -h now print usage and exit 0 on all three, and the loop usage spells out the steer batch shape since that is the one nobody can guess. Unknown verbs still fail, but now name the way out. cxc --version reads the installed manifest; previously the only way to know which payload was live was to read the cache directory name. Also from the same issue: scan record now accepts --cwd, which orchestrate already documented. The reporter's answer ledger was in one tree and the process cwd in another, so --derive matched nothing and said so only as a warning. help-verbs.test.ts asserts the contract (exit 0 plus a Usage: block) rather than the wording, and pins the flags that were previously rejection-only.
… a side (#48) Session files live at <cwd>/.codexclaw/sessions/<id>.json. The id is stable, the cwd is not, so a thread whose process cwd is one tree while its work is in another has two FSMs under one id and nothing says so. The reporter closed D in the wiki tree and the next turn re-injected Interview from the other copy. Pinning the store to the session-start workspace would invalidate every existing session file with no migration path, so this makes the split visible rather than flipping a coin. findForeignSessionCopies looks for the same id in plausible sibling roots and orchestrate status reports what it finds: session=<id> phase=IDLE ... WARNING: this session id also has state in 1 other tree(s); the phase above describes THIS cwd only. also at: .../cxc-split-a/.codexclaw/sessions/<id>.json Detection only - the other tree is never read from or written to. The candidate list is deliberately shallow because this is a warning on a read-only command, not a filesystem crawl. Also from the same issue: loop show --slug was cwd-only and printed "no plan found" from the wrong tree. loop init --session already binds the slug into the session file, so resolveSlug now falls back to that binding - which also makes the session the source of truth rather than whichever directory the shell was in. The underlying cwd-keyed storage is unchanged; you are now told about the split rather than misled by it.
… prevent (#49) receipt test refused a receipt when the check command dirtied the tree, even when the dirty files were the artifacts the check exists to rebuild. The ontology validator IS the documented gate for that repo. The reported workaround was to commit the generated files and run a no-op existence check instead - a receipt that certifies nothing. A forged receipt is strictly worse than a loose one, because it satisfies CHECK-BINDING-01 while proving less than no receipt at all. --generated declares paths the check rewrites by design. Repeatable, repo- relative, prefix-matched. Everything undeclared is still refused, verified four ways: undeclared rewrite refused, wrong path declared still refused, a declared FILE does not cover its siblings, and a missing value is a parse error rather than a silent skip. The refusal now names the flag so the next agent finds the sanctioned route instead of reinventing the no-op trick, and the receipt records generatedPaths so a reader sees what was permitted. orchestrate D refused a goalplan whose work-phases were all done, because advanceWorkPhase returns no_active for both 'plan is empty' and 'plan is complete'. The reported workaround was to write a finished phase back to in_progress purely to pass the gate - corrupting the record to satisfy a check about the record. D now closes over a complete plan, and the refusal names which real cause applies (empty, or everything blocked). The goalplan ledger says 'cycle closed over an already-complete plan' rather than 'closed null'. SOURCE-DELTA-01 was also raised. Left unchanged deliberately: I hit it twice in this session and both times it was right. A gate that occasionally annoys beats one that lets an empty B through.
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.
Promotes
devtomainfor 0.2.12: three filed bugs, all of them cases wherecodexclaw obstructed an agent that was following its own instructions.
#47 — the sibling commands had no
--helpcxc --helppoints atloop,scanandreceipt. Following that pointerfailed:
--helpwas an unknown verb on all three, andcxc --versionwas anunknown command.
orchestratewas fixed for exactly this in260709_cxc_help_agent_ux; its siblings never were.The individual error messages were fine. The defect is that discovery was only
available through failure — arming a goalplan in this session took six
consecutive rejections to assemble one command:
The
loopusage now spells out the steer batch shape.scan recordalso accepts--cwd, whichorchestratealready documented.Worth noting:
cxc --versionworked from one entry point and still failed fromthe other, because there are two. The test asserts both — that is the mistake it
exists to catch.
#48 — one session id, two FSMs
Session files live at
<cwd>/.codexclaw/sessions/<id>.json. The id is stable,the cwd is not, so a thread whose cwd is one tree while its work is in another
has two FSMs under one id. The reporter closed D in the wiki tree and the next
turn re-injected Interview from the other copy.
Pinning the store to the session-start workspace would invalidate every existing
session file with no migration path, so this makes the split visible instead:
Detection only — the other tree is never read from or written to.
loop showalso accepts
--sessionand resolves the slug the session already carries.#49 — two gates that forced the forgery they prevent
receipt testrefused a receipt whenever the check dirtied the tree, includingwhen the dirty files were the artifacts the check exists to rebuild. The reported
workaround was to commit the generated files and run a no-op existence check — a
receipt that certifies nothing. A forged receipt is strictly worse than a loose
one, because it satisfies CHECK-BINDING-01 while proving less than no receipt.
--generated <path>declares expected rewrites. Everything undeclared is stillrefused, verified four ways including that a declared FILE does not cover its
siblings.
orchestrate Drefused a goalplan whose work-phases were all done, because"complete" and "empty" produced the same internal result. The workaround was to
write a finished phase back to
in_progresspurely to pass the gate — corruptingthe record to satisfy a check about the record.
SOURCE-DELTA-01was raised in the same issue and deliberately left alone: I hitit twice while doing this work and both times it was right.
Verification
--generatedverified end to end on a throwaway git repo whose validatorrewrites its own output: refused without the flag, receipt written with it,
still refused when the wrong path is declared
#48warning verified against two real trees holding the same id