docs: repository code trace + fix the keyless evidence scripts broken by signed-by-default (F1, F1b) - #193
Merged
Conversation
Adds docs/repository-code-trace.md, a file:line trace of how the packages compose: the gate decision order, signing and provenance checks, council routing and model backends, verdict-on-facts re-verification, the build orchestrator and proposal-lifecycle sequence, the closed sets, merkle-dag content addressing, the products above the spine, the CI jobs, and the active authority record. Section 7 records thirteen findings confirmed against source on this commit, including: the keyless lifecycle e2e evidence script now fails under the signed-by-default gate (passes with TELOS_SECRET_* set); the CLI gate path skips proposal-lifecycle enforcement while reporting it enforced; authorization is checked once before dispatch and a respec re-plans without a new decision; and an unregistered mythological name in workflows/. No code is changed by this commit. Verified: build-gate and merkle-dag npm test green; fail-closed demo OK; verify-contracts 313/313; clotho self-weave verify-committed OK; portable-paths 0 violations; check-workflow OK. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JSb8WNmvor3GNapDqUbc4T
Owner
Author
|
CI note: the
Re-running the failed job once to confirm it reproduces; all other checks on this head are green so far. Generated by Claude Code |
Section 9 traces the GitHub side: the PR series that produced the current main (security sweep #155-#161, signed-by-default #186, marketplace rename #191, workflow oracle #188), the 12 open PRs including the parked per-node verify stage in #192, the 14 open issues mapped to the sections of this document, and the Claude Code Review workflow's failure pattern (29 of the last 40 runs, clustered in bursts, failing before any model call). Adds F14: connectors/meta-ads-mcp has no package.json, tests, CI job, manifest entry, or PACKAGE_ROOTS classification. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JSb8WNmvor3GNapDqUbc4T
…gate path Since the gate became signed-by-default (c8f4ebf), run-lifecycle-e2e.mjs set no trust_mode and no seat secrets, so both variants were blocked ("trust_mode 'signed' but no secret to verify ... packet") while the committed summary still said acceptance_ok: true. Rather than downgrade the evidence to advisory mode, the script now mints ephemeral per-run TELOS_SECRET_<SEAT> values for the required seats when none are set (operator-provided secrets are left untouched; nothing is written to disk), declares trust_mode "signed" explicitly, and records which seat secrets were ephemeral in the summary. A third variant, "unsigned", withholds TELOS_SECRET_CODEX and requires the gate to block at the approval phase with no verify node minted and no build, so the summary's signed claim is verified by the run rather than self-reported. Both proposal-lifecycle evidence scripts now run in the fail-closed-proof CI job. The README describes the third variant and the ephemeral-secret discipline. The code trace marks F1 as fixed and adds F1a: a missing-secret blocker coexisting with a reparable finding yields "revise" for one cycle before "blocked", because deriveOutcome checks finding classes before the blocker count. Verified: e2e ACCEPTANCE OK keyless (env scrubbed) and with operator secrets set; primitive demo ACCEPTANCE OK; fail-closed demo OK; verify-contracts 313/313; clotho self-weave verify-committed OK; portable-paths 0 violations; check-workflow OK; ci.yml parses. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JSb8WNmvor3GNapDqUbc4T
5 tasks
…nce script) Section 10 traces build-gate/build-orchestrator.mjs commit by commit (seven commits, three stable exports), the PR each landed through, the dependency churn around it, and every buildProject consumer with its keyless status on this commit. F1b records that docs/runs/agentic-teams-situational/run-teams-situational.mjs is a second instance of F1: an inline dossier without trust_mode and unsigned mock packets now block at the approval phase keyless, while its committed summary still says the build succeeded. It passes with TELOS_SECRET_* set. The two sibling team scripts survive only because their fixture dossiers were switched to advisory. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JSb8WNmvor3GNapDqUbc4T
…ed gate path (F1b) run-teams-situational.mjs built its dossier inline with no trust_mode and returned unsigned mock packets, so since the gate became signed-by-default (c8f4ebf) it was blocked at the approval phase keyless while its committed run-summary.json still claimed a successful build. Same fix shape as the lifecycle e2e: mint ephemeral per-run TELOS_SECRET_<SEAT> values when none are set (operator secrets untouched, nothing written to disk), declare trust_mode "signed" explicitly, and record seat-secret provenance in the summary. The regenerated summary is byte-identical across runs. The fail-closed-proof CI job now also runs the three keyless agentic-teams evidence scripts (situational, run-teams, run-teams-market). The code trace marks F1b fixed and updates the consumer table and CI job description. Verified: situational script merge_status=ready keyless (env scrubbed) and with operator secrets; run-teams and run-teams-market pass keyless; ci.yml parses; portable-paths 0 violations; verify-contracts 313/313. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JSb8WNmvor3GNapDqUbc4T
dsmcewan
marked this pull request as ready for review
September 24, 2026 14:05
dsmcewan
pushed a commit
that referenced
this pull request
Sep 24, 2026
Bring the per-node verify stage up to date with main (079e77e), which now carries #193 (repo code trace + keyless evidence fixes), #196 (gate verdict surfacing + runBuild refusals as phased results, F1/F5), and #194 (trace docs). build-orchestrator.mjs auto-merges cleanly: the verify-stage changes and the F1/F5 changes touch different regions. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013rxfYqddLk2NykrPkjy1Pr
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.
What
Three things, in five commits:
1.
docs/repository-code-trace.md— afile:linetrace of how the packages actually compose, written as the call-path companion torepository-manifest.json. It covers the package topology, the trust spine (order of checks invalidateRecords, fail-closedtrust_modedefault, HMAC canonical form, council routing, model backends, verdict-on-facts), the build orchestrator and proposal lifecycle (every step, outcome string and closed set), merkle-dag content addressing, the products above the spine, CI, the active authority record, a GitHub lineage section, a build-orchestrator commit lineage, and sixteen findings confirmed against source.2. Fix for F1 —
docs/runs/proposal-lifecycle/run-lifecycle-e2e.mjshad been failing keyless since the gate became signed-by-default inc8f4ebf: both variants were blocked ontrust_mode 'signed' but no secret to verify … packet, while the committed summary still saidacceptance_ok: true. Rather than downgrade the evidence to advisory mode, the script now mints ephemeral per-runTELOS_SECRET_<SEAT>values when none are set (operator secrets left untouched, nothing written to disk), declarestrust_mode: "signed"explicitly, records which seat secrets were ephemeral vs operator-provided, and adds a thirdunsignedvariant that withholdsTELOS_SECRET_CODEXand must beblockedat the approval phase, so the signed claim is verified by the run rather than self-reported.3. Fix for F1b —
docs/runs/agentic-teams-situational/run-teams-situational.mjswas a second instance of the same drift: inline dossier with notrust_mode, unsigned mock packets, blocked at approval keyless while its committedrun-summary.jsonstill claimedphase: "build", ok: true. Same fix shape (ephemeral seat secrets, explicittrust_mode: "signed", seat-secret provenance in the summary). The regenerated summary is byte-identical across runs.The
fail-closed-proofCI job now runs both proposal-lifecycle evidence scripts and the three keyless agentic-teams scripts (situational, run-teams, run-teams-market), so this class of drift cannot recur silently.docs/runs/is outside the env-surface contract's scan scope, so the new env writes do not touch that contract.Other findings worth a look (unchanged by this PR): F2 the CLI gate path never supplies the ledger dir, so lifecycle enforcement is skipped while reported as enforced; F3 authorization is checked once before dispatch and a
respecre-plans without a new decision; F4/F5 provenance provider is never bound to the seat and legacy-mode packets have no replay protection; F11workflows/hestia.jsuses an unregistered mythological name; F14connectors/meta-ads-mcpis outside every oracle; F1a a missing-secret blocker alongside a reparable finding yieldsrevisefor one cycle beforeblocked.Checklist
.telos/artifacts, secrets,.env*, or*.pemfiles committedrun-lifecycle-e2e-summary.jsonandagentic-teams-situational/run-summary.jsonregenerated by their own scripts (both deterministic);proposal-lifecycle/run-summary.jsondeliberately not committed because its plan hashes change every run (ephemeral signer keys are pinned intoplan_hash)node docs/institutional-memory/verify-contracts.mjsandnode docs/runs/clotho-self-weave/run.mjs --verify-committedboth passTest results
Node 22.22.2, on the final commit:
env -u TELOS_SECRET_CLAUDE -u TELOS_SECRET_AGY -u TELOS_SECRET_CODEX node docs/runs/proposal-lifecycle/run-lifecycle-e2e.mjs->ACCEPTANCE OK(discharged ready, control blocked byUNDISCHARGED_OBLIGATION, unsigned blocked at approval); same withTELOS_SECRET_*set ->ACCEPTANCE OKnode docs/runs/proposal-lifecycle/run-proposal-lifecycle.mjs->ACCEPTANCE OKenv -u TELOS_SECRET_* node docs/runs/agentic-teams-situational/run-teams-situational.mjs->phase=build ok=true merge_status=ready self_corrected=true; same with secrets set; summary identical across two runsnode docs/runs/agentic-teams/run-teams.mjsandnode docs/runs/agentic-teams-market/run-teams-market.mjs->merge_status=readykeylessnode docs/runs/fail-closed-demo/run.mjs->BLOCKED/HALTED/VERIFIED,ok:truecd build-gate && npm test(runsbreakouttoo) -> green;cd merkle-dag && npm test-> green (first commit; no package source changed since)node docs/institutional-memory/verify-contracts.mjs-> 313/313 contracts matchnode docs/runs/clotho-self-weave/run.mjs --verify-committed->ok:true, 4559 trusted recordsnode .github/scripts/check-portable-paths.mjs-> 0 violationsnode docs/institutional-memory/iliad/workflow/check-workflow.mjs-> OK.github/workflows/ci.ymlparses (PyYAML)🤖 Generated with Claude Code
https://claude.ai/code/session_01JSb8WNmvor3GNapDqUbc4T