approval-md 0.0.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +176 -0
- package/NOTICE +5 -0
- package/README.md +940 -4
- package/SPEC.md +476 -34
- package/cli.js +29 -3
- package/dist/src/adapters/agentmail.d.ts +426 -0
- package/dist/src/adapters/agentmail.js +1200 -0
- package/dist/src/adapters/agentmail.js.map +1 -0
- package/dist/src/adapters/conformance.d.ts +149 -0
- package/dist/src/adapters/conformance.js +461 -0
- package/dist/src/adapters/conformance.js.map +1 -0
- package/dist/src/adapters/contract.d.ts +628 -0
- package/dist/src/adapters/contract.js +1035 -0
- package/dist/src/adapters/contract.js.map +1 -0
- package/dist/src/adapters/email.d.ts +324 -0
- package/dist/src/adapters/email.js +749 -0
- package/dist/src/adapters/email.js.map +1 -0
- package/dist/src/adapters/env-passphrase.d.ts +93 -0
- package/dist/src/adapters/env-passphrase.js +132 -0
- package/dist/src/adapters/env-passphrase.js.map +1 -0
- package/dist/src/adapters/public.d.ts +11 -0
- package/dist/src/adapters/public.js +11 -0
- package/dist/src/adapters/public.js.map +1 -0
- package/dist/src/adapters/registry.d.ts +59 -0
- package/dist/src/adapters/registry.js +77 -0
- package/dist/src/adapters/registry.js.map +1 -0
- package/dist/src/adapters/smtp.d.ts +213 -0
- package/dist/src/adapters/smtp.js +499 -0
- package/dist/src/adapters/smtp.js.map +1 -0
- package/dist/src/adapters/vault-provider.d.ts +114 -0
- package/dist/src/adapters/vault-provider.js +161 -0
- package/dist/src/adapters/vault-provider.js.map +1 -0
- package/dist/src/adapters/zzz.d.ts +66 -0
- package/dist/src/adapters/zzz.js +299 -0
- package/dist/src/adapters/zzz.js.map +1 -0
- package/dist/src/channels/batch.d.ts +109 -0
- package/dist/src/channels/batch.js +121 -0
- package/dist/src/channels/batch.js.map +1 -0
- package/dist/src/channels/cli.d.ts +193 -0
- package/dist/src/channels/cli.js +468 -0
- package/dist/src/channels/cli.js.map +1 -0
- package/dist/src/channels/conformance.d.ts +92 -0
- package/dist/src/channels/conformance.js +445 -0
- package/dist/src/channels/conformance.js.map +1 -0
- package/dist/src/channels/contract.d.ts +623 -0
- package/dist/src/channels/contract.js +494 -0
- package/dist/src/channels/contract.js.map +1 -0
- package/dist/src/channels/payload-view.d.ts +35 -0
- package/dist/src/channels/payload-view.js +43 -0
- package/dist/src/channels/payload-view.js.map +1 -0
- package/dist/src/channels/render-queue.d.ts +149 -0
- package/dist/src/channels/render-queue.js +564 -0
- package/dist/src/channels/render-queue.js.map +1 -0
- package/dist/src/channels/tagging.d.ts +196 -0
- package/dist/src/channels/tagging.js +723 -0
- package/dist/src/channels/tagging.js.map +1 -0
- package/dist/src/channels/telegram.d.ts +1832 -0
- package/dist/src/channels/telegram.js +3190 -0
- package/dist/src/channels/telegram.js.map +1 -0
- package/dist/src/channels/web.d.ts +341 -0
- package/dist/src/channels/web.js +903 -0
- package/dist/src/channels/web.js.map +1 -0
- package/dist/src/cli/adapter.d.ts +90 -0
- package/dist/src/cli/adapter.js +288 -0
- package/dist/src/cli/adapter.js.map +1 -0
- package/dist/src/cli/amend.d.ts +59 -0
- package/dist/src/cli/amend.js +2171 -0
- package/dist/src/cli/amend.js.map +1 -0
- package/dist/src/cli/args.d.ts +43 -0
- package/dist/src/cli/args.js +86 -0
- package/dist/src/cli/args.js.map +1 -0
- package/dist/src/cli/attest.d.ts +41 -0
- package/dist/src/cli/attest.js +307 -0
- package/dist/src/cli/attest.js.map +1 -0
- package/dist/src/cli/audit-card.d.ts +62 -0
- package/dist/src/cli/audit-card.js +201 -0
- package/dist/src/cli/audit-card.js.map +1 -0
- package/dist/src/cli/audit.d.ts +59 -0
- package/dist/src/cli/audit.js +460 -0
- package/dist/src/cli/audit.js.map +1 -0
- package/dist/src/cli/channel-telegram.d.ts +806 -0
- package/dist/src/cli/channel-telegram.js +2063 -0
- package/dist/src/cli/channel-telegram.js.map +1 -0
- package/dist/src/cli/channel-web.d.ts +131 -0
- package/dist/src/cli/channel-web.js +357 -0
- package/dist/src/cli/channel-web.js.map +1 -0
- package/dist/src/cli/channel.d.ts +71 -0
- package/dist/src/cli/channel.js +438 -0
- package/dist/src/cli/channel.js.map +1 -0
- package/dist/src/cli/checkpoint-tap.d.ts +169 -0
- package/dist/src/cli/checkpoint-tap.js +238 -0
- package/dist/src/cli/checkpoint-tap.js.map +1 -0
- package/dist/src/cli/codex.d.ts +2 -0
- package/dist/src/cli/codex.js +172 -0
- package/dist/src/cli/codex.js.map +1 -0
- package/dist/src/cli/coverage.d.ts +61 -0
- package/dist/src/cli/coverage.js +343 -0
- package/dist/src/cli/coverage.js.map +1 -0
- package/dist/src/cli/daemon.d.ts +120 -0
- package/dist/src/cli/daemon.js +631 -0
- package/dist/src/cli/daemon.js.map +1 -0
- package/dist/src/cli/doctor.d.ts +129 -0
- package/dist/src/cli/doctor.js +2762 -0
- package/dist/src/cli/doctor.js.map +1 -0
- package/dist/src/cli/env.d.ts +65 -0
- package/dist/src/cli/env.js +302 -0
- package/dist/src/cli/env.js.map +1 -0
- package/dist/src/cli/execute.d.ts +202 -0
- package/dist/src/cli/execute.js +1682 -0
- package/dist/src/cli/execute.js.map +1 -0
- package/dist/src/cli/exit-codes.d.ts +73 -0
- package/dist/src/cli/exit-codes.js +82 -0
- package/dist/src/cli/exit-codes.js.map +1 -0
- package/dist/src/cli/feedback.d.ts +60 -0
- package/dist/src/cli/feedback.js +205 -0
- package/dist/src/cli/feedback.js.map +1 -0
- package/dist/src/cli/gate-window.d.ts +40 -0
- package/dist/src/cli/gate-window.js +294 -0
- package/dist/src/cli/gate-window.js.map +1 -0
- package/dist/src/cli/gate.d.ts +68 -0
- package/dist/src/cli/gate.js +557 -0
- package/dist/src/cli/gate.js.map +1 -0
- package/dist/src/cli/git-scope.d.ts +190 -0
- package/dist/src/cli/git-scope.js +295 -0
- package/dist/src/cli/git-scope.js.map +1 -0
- package/dist/src/cli/gloss-attach.d.ts +85 -0
- package/dist/src/cli/gloss-attach.js +107 -0
- package/dist/src/cli/gloss-attach.js.map +1 -0
- package/dist/src/cli/gloss-codex-child.d.ts +9 -0
- package/dist/src/cli/gloss-codex-child.js +149 -0
- package/dist/src/cli/gloss-codex-child.js.map +1 -0
- package/dist/src/cli/gloss-codex.d.ts +24 -0
- package/dist/src/cli/gloss-codex.js +255 -0
- package/dist/src/cli/gloss-codex.js.map +1 -0
- package/dist/src/cli/gloss-options.d.ts +42 -0
- package/dist/src/cli/gloss-options.js +79 -0
- package/dist/src/cli/gloss-options.js.map +1 -0
- package/dist/src/cli/gloss.d.ts +265 -0
- package/dist/src/cli/gloss.js +362 -0
- package/dist/src/cli/gloss.js.map +1 -0
- package/dist/src/cli/help.d.ts +103 -0
- package/dist/src/cli/help.js +2339 -0
- package/dist/src/cli/help.js.map +1 -0
- package/dist/src/cli/hook-codex.d.ts +78 -0
- package/dist/src/cli/hook-codex.js +167 -0
- package/dist/src/cli/hook-codex.js.map +1 -0
- package/dist/src/cli/hook.d.ts +331 -0
- package/dist/src/cli/hook.js +2849 -0
- package/dist/src/cli/hook.js.map +1 -0
- package/dist/src/cli/import.d.ts +35 -0
- package/dist/src/cli/import.js +175 -0
- package/dist/src/cli/import.js.map +1 -0
- package/dist/src/cli/init.d.ts +84 -0
- package/dist/src/cli/init.js +336 -0
- package/dist/src/cli/init.js.map +1 -0
- package/dist/src/cli/instructions.d.ts +23 -0
- package/dist/src/cli/instructions.js +262 -0
- package/dist/src/cli/instructions.js.map +1 -0
- package/dist/src/cli/journal.d.ts +41 -0
- package/dist/src/cli/journal.js +238 -0
- package/dist/src/cli/journal.js.map +1 -0
- package/dist/src/cli/log-advance.d.ts +287 -0
- package/dist/src/cli/log-advance.js +840 -0
- package/dist/src/cli/log-advance.js.map +1 -0
- package/dist/src/cli/log-anchor.d.ts +176 -0
- package/dist/src/cli/log-anchor.js +387 -0
- package/dist/src/cli/log-anchor.js.map +1 -0
- package/dist/src/cli/log-checkpoint.d.ts +22 -0
- package/dist/src/cli/log-checkpoint.js +128 -0
- package/dist/src/cli/log-checkpoint.js.map +1 -0
- package/dist/src/cli/log-sync.d.ts +243 -0
- package/dist/src/cli/log-sync.js +849 -0
- package/dist/src/cli/log-sync.js.map +1 -0
- package/dist/src/cli/log-verbs.d.ts +16 -0
- package/dist/src/cli/log-verbs.js +360 -0
- package/dist/src/cli/log-verbs.js.map +1 -0
- package/dist/src/cli/long-help.d.ts +70 -0
- package/dist/src/cli/long-help.js +148 -0
- package/dist/src/cli/long-help.js.map +1 -0
- package/dist/src/cli/main.d.ts +77 -0
- package/dist/src/cli/main.js +1206 -0
- package/dist/src/cli/main.js.map +1 -0
- package/dist/src/cli/mcp.d.ts +52 -0
- package/dist/src/cli/mcp.js +306 -0
- package/dist/src/cli/mcp.js.map +1 -0
- package/dist/src/cli/paths.d.ts +56 -0
- package/dist/src/cli/paths.js +79 -0
- package/dist/src/cli/paths.js.map +1 -0
- package/dist/src/cli/payload.d.ts +58 -0
- package/dist/src/cli/payload.js +253 -0
- package/dist/src/cli/payload.js.map +1 -0
- package/dist/src/cli/policy.d.ts +43 -0
- package/dist/src/cli/policy.js +229 -0
- package/dist/src/cli/policy.js.map +1 -0
- package/dist/src/cli/preflight.d.ts +363 -0
- package/dist/src/cli/preflight.js +1175 -0
- package/dist/src/cli/preflight.js.map +1 -0
- package/dist/src/cli/progress.d.ts +78 -0
- package/dist/src/cli/progress.js +112 -0
- package/dist/src/cli/progress.js.map +1 -0
- package/dist/src/cli/prompt.d.ts +209 -0
- package/dist/src/cli/prompt.js +312 -0
- package/dist/src/cli/prompt.js.map +1 -0
- package/dist/src/cli/quickstart.d.ts +46 -0
- package/dist/src/cli/quickstart.js +297 -0
- package/dist/src/cli/quickstart.js.map +1 -0
- package/dist/src/cli/records.d.ts +34 -0
- package/dist/src/cli/records.js +66 -0
- package/dist/src/cli/records.js.map +1 -0
- package/dist/src/cli/render.d.ts +22 -0
- package/dist/src/cli/render.js +132 -0
- package/dist/src/cli/render.js.map +1 -0
- package/dist/src/cli/sandbox.d.ts +51 -0
- package/dist/src/cli/sandbox.js +150 -0
- package/dist/src/cli/sandbox.js.map +1 -0
- package/dist/src/cli/scaffold.d.ts +79 -0
- package/dist/src/cli/scaffold.js +137 -0
- package/dist/src/cli/scaffold.js.map +1 -0
- package/dist/src/cli/setup-adapter.d.ts +137 -0
- package/dist/src/cli/setup-adapter.js +509 -0
- package/dist/src/cli/setup-adapter.js.map +1 -0
- package/dist/src/cli/setup-channel.d.ts +117 -0
- package/dist/src/cli/setup-channel.js +635 -0
- package/dist/src/cli/setup-channel.js.map +1 -0
- package/dist/src/cli/setup-checkpoint.d.ts +57 -0
- package/dist/src/cli/setup-checkpoint.js +196 -0
- package/dist/src/cli/setup-checkpoint.js.map +1 -0
- package/dist/src/cli/setup-common.d.ts +275 -0
- package/dist/src/cli/setup-common.js +376 -0
- package/dist/src/cli/setup-common.js.map +1 -0
- package/dist/src/cli/setup-flow.d.ts +287 -0
- package/dist/src/cli/setup-flow.js +476 -0
- package/dist/src/cli/setup-flow.js.map +1 -0
- package/dist/src/cli/setup-service.d.ts +96 -0
- package/dist/src/cli/setup-service.js +308 -0
- package/dist/src/cli/setup-service.js.map +1 -0
- package/dist/src/cli/setup.d.ts +202 -0
- package/dist/src/cli/setup.js +473 -0
- package/dist/src/cli/setup.js.map +1 -0
- package/dist/src/cli/style.d.ts +320 -0
- package/dist/src/cli/style.js +469 -0
- package/dist/src/cli/style.js.map +1 -0
- package/dist/src/cli/token.d.ts +39 -0
- package/dist/src/cli/token.js +274 -0
- package/dist/src/cli/token.js.map +1 -0
- package/dist/src/cli/up.d.ts +155 -0
- package/dist/src/cli/up.js +849 -0
- package/dist/src/cli/up.js.map +1 -0
- package/dist/src/cli/usage.d.ts +37 -0
- package/dist/src/cli/usage.js +91 -0
- package/dist/src/cli/usage.js.map +1 -0
- package/dist/src/cli/values.d.ts +40 -0
- package/dist/src/cli/values.js +189 -0
- package/dist/src/cli/values.js.map +1 -0
- package/dist/src/cli/vault.d.ts +59 -0
- package/dist/src/cli/vault.js +362 -0
- package/dist/src/cli/vault.js.map +1 -0
- package/dist/src/cli/verb-registry.d.ts +76 -0
- package/dist/src/cli/verb-registry.js +2341 -0
- package/dist/src/cli/verb-registry.js.map +1 -0
- package/dist/src/cli/wordmark.d.ts +31 -0
- package/dist/src/cli/wordmark.js +52 -0
- package/dist/src/cli/wordmark.js.map +1 -0
- package/dist/src/codex/doctor.d.ts +13 -0
- package/dist/src/codex/doctor.js +41 -0
- package/dist/src/codex/doctor.js.map +1 -0
- package/dist/src/codex/manifest.d.ts +49 -0
- package/dist/src/codex/manifest.js +103 -0
- package/dist/src/codex/manifest.js.map +1 -0
- package/dist/src/codex/templates.d.ts +41 -0
- package/dist/src/codex/templates.js +319 -0
- package/dist/src/codex/templates.js.map +1 -0
- package/dist/src/codex/trust.d.ts +19 -0
- package/dist/src/codex/trust.js +183 -0
- package/dist/src/codex/trust.js.map +1 -0
- package/dist/src/codex/workspace-plan.d.ts +131 -0
- package/dist/src/codex/workspace-plan.js +561 -0
- package/dist/src/codex/workspace-plan.js.map +1 -0
- package/dist/src/core/actor.d.ts +2 -0
- package/dist/src/core/actor.js +5 -0
- package/dist/src/core/actor.js.map +1 -0
- package/dist/src/core/advance-cycle.d.ts +170 -0
- package/dist/src/core/advance-cycle.js +200 -0
- package/dist/src/core/advance-cycle.js.map +1 -0
- package/dist/src/core/agents-md.d.ts +276 -0
- package/dist/src/core/agents-md.js +747 -0
- package/dist/src/core/agents-md.js.map +1 -0
- package/dist/src/core/apply-patch.d.ts +49 -0
- package/dist/src/core/apply-patch.js +266 -0
- package/dist/src/core/apply-patch.js.map +1 -0
- package/dist/src/core/attest.d.ts +420 -0
- package/dist/src/core/attest.js +589 -0
- package/dist/src/core/attest.js.map +1 -0
- package/dist/src/core/audit.d.ts +492 -0
- package/dist/src/core/audit.js +882 -0
- package/dist/src/core/audit.js.map +1 -0
- package/dist/src/core/budgets.d.ts +238 -0
- package/dist/src/core/budgets.js +449 -0
- package/dist/src/core/budgets.js.map +1 -0
- package/dist/src/core/checkpoint.d.ts +500 -0
- package/dist/src/core/checkpoint.js +738 -0
- package/dist/src/core/checkpoint.js.map +1 -0
- package/dist/src/core/child-env.d.ts +88 -0
- package/dist/src/core/child-env.js +86 -0
- package/dist/src/core/child-env.js.map +1 -0
- package/dist/src/core/clock.d.ts +52 -0
- package/dist/src/core/clock.js +43 -0
- package/dist/src/core/clock.js.map +1 -0
- package/dist/src/core/command-class.d.ts +543 -0
- package/dist/src/core/command-class.js +2356 -0
- package/dist/src/core/command-class.js.map +1 -0
- package/dist/src/core/coverage-sources/adapter.d.ts +40 -0
- package/dist/src/core/coverage-sources/adapter.js +71 -0
- package/dist/src/core/coverage-sources/adapter.js.map +1 -0
- package/dist/src/core/coverage-sources/gh.d.ts +48 -0
- package/dist/src/core/coverage-sources/gh.js +136 -0
- package/dist/src/core/coverage-sources/gh.js.map +1 -0
- package/dist/src/core/coverage-sources/git.d.ts +101 -0
- package/dist/src/core/coverage-sources/git.js +269 -0
- package/dist/src/core/coverage-sources/git.js.map +1 -0
- package/dist/src/core/coverage.d.ts +217 -0
- package/dist/src/core/coverage.js +337 -0
- package/dist/src/core/coverage.js.map +1 -0
- package/dist/src/core/credential-spec.d.ts +72 -0
- package/dist/src/core/credential-spec.js +23 -0
- package/dist/src/core/credential-spec.js.map +1 -0
- package/dist/src/core/dark-session.d.ts +331 -0
- package/dist/src/core/dark-session.js +714 -0
- package/dist/src/core/dark-session.js.map +1 -0
- package/dist/src/core/decision-refusal.d.ts +185 -0
- package/dist/src/core/decision-refusal.js +265 -0
- package/dist/src/core/decision-refusal.js.map +1 -0
- package/dist/src/core/env-file.d.ts +450 -0
- package/dist/src/core/env-file.js +837 -0
- package/dist/src/core/env-file.js.map +1 -0
- package/dist/src/core/execute.d.ts +858 -0
- package/dist/src/core/execute.js +1271 -0
- package/dist/src/core/execute.js.map +1 -0
- package/dist/src/core/frontmatter.d.ts +78 -0
- package/dist/src/core/frontmatter.js +100 -0
- package/dist/src/core/frontmatter.js.map +1 -0
- package/dist/src/core/gate-window.d.ts +312 -0
- package/dist/src/core/gate-window.js +506 -0
- package/dist/src/core/gate-window.js.map +1 -0
- package/dist/src/core/gate.d.ts +1364 -0
- package/dist/src/core/gate.js +3002 -0
- package/dist/src/core/gate.js.map +1 -0
- package/dist/src/core/git-run.d.ts +73 -0
- package/dist/src/core/git-run.js +93 -0
- package/dist/src/core/git-run.js.map +1 -0
- package/dist/src/core/harness-version.d.ts +157 -0
- package/dist/src/core/harness-version.js +211 -0
- package/dist/src/core/harness-version.js.map +1 -0
- package/dist/src/core/harness-wait.d.ts +55 -0
- package/dist/src/core/harness-wait.js +58 -0
- package/dist/src/core/harness-wait.js.map +1 -0
- package/dist/src/core/head-retry.d.ts +107 -0
- package/dist/src/core/head-retry.js +121 -0
- package/dist/src/core/head-retry.js.map +1 -0
- package/dist/src/core/instance.d.ts +253 -0
- package/dist/src/core/instance.js +319 -0
- package/dist/src/core/instance.js.map +1 -0
- package/dist/src/core/intake-limits.d.ts +247 -0
- package/dist/src/core/intake-limits.js +350 -0
- package/dist/src/core/intake-limits.js.map +1 -0
- package/dist/src/core/jcs.d.ts +52 -0
- package/dist/src/core/jcs.js +132 -0
- package/dist/src/core/jcs.js.map +1 -0
- package/dist/src/core/journal.d.ts +144 -0
- package/dist/src/core/journal.js +200 -0
- package/dist/src/core/journal.js.map +1 -0
- package/dist/src/core/live-draw.d.ts +436 -0
- package/dist/src/core/live-draw.js +703 -0
- package/dist/src/core/live-draw.js.map +1 -0
- package/dist/src/core/log-reconcile.d.ts +89 -0
- package/dist/src/core/log-reconcile.js +136 -0
- package/dist/src/core/log-reconcile.js.map +1 -0
- package/dist/src/core/log-subscribe.d.ts +36 -0
- package/dist/src/core/log-subscribe.js +162 -0
- package/dist/src/core/log-subscribe.js.map +1 -0
- package/dist/src/core/log.d.ts +278 -0
- package/dist/src/core/log.js +546 -0
- package/dist/src/core/log.js.map +1 -0
- package/dist/src/core/loop.d.ts +274 -0
- package/dist/src/core/loop.js +487 -0
- package/dist/src/core/loop.js.map +1 -0
- package/dist/src/core/md-fence.d.ts +41 -0
- package/dist/src/core/md-fence.js +74 -0
- package/dist/src/core/md-fence.js.map +1 -0
- package/dist/src/core/money.d.ts +147 -0
- package/dist/src/core/money.js +195 -0
- package/dist/src/core/money.js.map +1 -0
- package/dist/src/core/payload-census.d.ts +74 -0
- package/dist/src/core/payload-census.js +146 -0
- package/dist/src/core/payload-census.js.map +1 -0
- package/dist/src/core/payload-store.d.ts +175 -0
- package/dist/src/core/payload-store.js +340 -0
- package/dist/src/core/payload-store.js.map +1 -0
- package/dist/src/core/payload.d.ts +71 -0
- package/dist/src/core/payload.js +80 -0
- package/dist/src/core/payload.js.map +1 -0
- package/dist/src/core/policy-diff.d.ts +292 -0
- package/dist/src/core/policy-diff.js +588 -0
- package/dist/src/core/policy-diff.js.map +1 -0
- package/dist/src/core/policy-expectations.d.ts +199 -0
- package/dist/src/core/policy-expectations.js +394 -0
- package/dist/src/core/policy-expectations.js.map +1 -0
- package/dist/src/core/policy-explain.d.ts +150 -0
- package/dist/src/core/policy-explain.js +258 -0
- package/dist/src/core/policy-explain.js.map +1 -0
- package/dist/src/core/policy-load.d.ts +527 -0
- package/dist/src/core/policy-load.js +536 -0
- package/dist/src/core/policy-load.js.map +1 -0
- package/dist/src/core/policy-match.d.ts +281 -0
- package/dist/src/core/policy-match.js +478 -0
- package/dist/src/core/policy-match.js.map +1 -0
- package/dist/src/core/policy-proposal.d.ts +265 -0
- package/dist/src/core/policy-proposal.js +458 -0
- package/dist/src/core/policy-proposal.js.map +1 -0
- package/dist/src/core/prompt-layout.d.ts +221 -0
- package/dist/src/core/prompt-layout.js +422 -0
- package/dist/src/core/prompt-layout.js.map +1 -0
- package/dist/src/core/protected-path-guard.d.ts +453 -0
- package/dist/src/core/protected-path-guard.js +1566 -0
- package/dist/src/core/protected-path-guard.js.map +1 -0
- package/dist/src/core/registration.d.ts +25 -0
- package/dist/src/core/registration.js +39 -0
- package/dist/src/core/registration.js.map +1 -0
- package/dist/src/core/reindex.d.ts +99 -0
- package/dist/src/core/reindex.js +336 -0
- package/dist/src/core/reindex.js.map +1 -0
- package/dist/src/core/sampler.d.ts +313 -0
- package/dist/src/core/sampler.js +388 -0
- package/dist/src/core/sampler.js.map +1 -0
- package/dist/src/core/sandbox.d.ts +290 -0
- package/dist/src/core/sandbox.js +424 -0
- package/dist/src/core/sandbox.js.map +1 -0
- package/dist/src/core/seal.d.ts +165 -0
- package/dist/src/core/seal.js +290 -0
- package/dist/src/core/seal.js.map +1 -0
- package/dist/src/core/state.d.ts +505 -0
- package/dist/src/core/state.js +1009 -0
- package/dist/src/core/state.js.map +1 -0
- package/dist/src/core/task-file.d.ts +185 -0
- package/dist/src/core/task-file.js +464 -0
- package/dist/src/core/task-file.js.map +1 -0
- package/dist/src/core/telegram-config.d.ts +93 -0
- package/dist/src/core/telegram-config.js +114 -0
- package/dist/src/core/telegram-config.js.map +1 -0
- package/dist/src/core/token.d.ts +409 -0
- package/dist/src/core/token.js +561 -0
- package/dist/src/core/token.js.map +1 -0
- package/dist/src/core/validate.d.ts +138 -0
- package/dist/src/core/validate.js +0 -0
- package/dist/src/core/validate.js.map +1 -0
- package/dist/src/core/values.d.ts +137 -0
- package/dist/src/core/values.js +153 -0
- package/dist/src/core/values.js.map +1 -0
- package/dist/src/core/vault.d.ts +291 -0
- package/dist/src/core/vault.js +612 -0
- package/dist/src/core/vault.js.map +1 -0
- package/dist/src/core/verified-snapshot.d.ts +204 -0
- package/dist/src/core/verified-snapshot.js +506 -0
- package/dist/src/core/verified-snapshot.js.map +1 -0
- package/dist/src/core/verify.d.ts +336 -0
- package/dist/src/core/verify.js +549 -0
- package/dist/src/core/verify.js.map +1 -0
- package/dist/src/core/version.d.ts +8 -0
- package/dist/src/core/version.js +9 -0
- package/dist/src/core/version.js.map +1 -0
- package/dist/src/core/wysiwys.d.ts +370 -0
- package/dist/src/core/wysiwys.js +728 -0
- package/dist/src/core/wysiwys.js.map +1 -0
- package/dist/src/daemon/advance-child.d.ts +39 -0
- package/dist/src/daemon/advance-child.js +78 -0
- package/dist/src/daemon/advance-child.js.map +1 -0
- package/dist/src/daemon/advance.d.ts +466 -0
- package/dist/src/daemon/advance.js +849 -0
- package/dist/src/daemon/advance.js.map +1 -0
- package/dist/src/daemon/audit.d.ts +87 -0
- package/dist/src/daemon/audit.js +90 -0
- package/dist/src/daemon/audit.js.map +1 -0
- package/dist/src/daemon/daemon.d.ts +1180 -0
- package/dist/src/daemon/daemon.js +1988 -0
- package/dist/src/daemon/daemon.js.map +1 -0
- package/dist/src/daemon/dark-session.d.ts +64 -0
- package/dist/src/daemon/dark-session.js +119 -0
- package/dist/src/daemon/dark-session.js.map +1 -0
- package/dist/src/daemon/draw-child.d.ts +36 -0
- package/dist/src/daemon/draw-child.js +132 -0
- package/dist/src/daemon/draw-child.js.map +1 -0
- package/dist/src/daemon/draw.d.ts +154 -0
- package/dist/src/daemon/draw.js +458 -0
- package/dist/src/daemon/draw.js.map +1 -0
- package/dist/src/daemon/git-evidence.d.ts +173 -0
- package/dist/src/daemon/git-evidence.js +345 -0
- package/dist/src/daemon/git-evidence.js.map +1 -0
- package/dist/src/daemon/projection.d.ts +180 -0
- package/dist/src/daemon/projection.js +233 -0
- package/dist/src/daemon/projection.js.map +1 -0
- package/dist/src/daemon/prune.d.ts +207 -0
- package/dist/src/daemon/prune.js +376 -0
- package/dist/src/daemon/prune.js.map +1 -0
- package/dist/src/mcp/http.d.ts +113 -0
- package/dist/src/mcp/http.js +343 -0
- package/dist/src/mcp/http.js.map +1 -0
- package/dist/src/mcp/server.d.ts +265 -0
- package/dist/src/mcp/server.js +602 -0
- package/dist/src/mcp/server.js.map +1 -0
- package/docs/adapter-api.md +106 -0
- package/docs/cli-reference.md +5716 -0
- package/docs/codex-enforced-session.md +30 -0
- package/package.json +53 -4
- package/schema/.gitkeep +0 -0
- package/schema/LICENSE +117 -0
- package/schema/codex-instance.schema.json +82 -0
- package/schema/envelope.schema.json +137 -0
- package/schema/event.schema.json +1811 -0
- package/schema/fixtures/codex-instance/invalid/unpinned-codex-version.json +40 -0
- package/schema/fixtures/codex-instance/valid/canonical.json +40 -0
- package/schema/fixtures/envelope/invalid/action-missing-idempotency-key.json +15 -0
- package/schema/fixtures/envelope/invalid/action-unknown-class-format.json +14 -0
- package/schema/fixtures/envelope/invalid/confidence-out-of-range.json +11 -0
- package/schema/fixtures/envelope/invalid/est-cost-bare-number.json +14 -0
- package/schema/fixtures/envelope/invalid/est-cost-noncanonical-string.json +14 -0
- package/schema/fixtures/envelope/invalid/malformed-assignee.json +10 -0
- package/schema/fixtures/envelope/invalid/malformed-created-by.json +7 -0
- package/schema/fixtures/envelope/invalid/malformed-max-latency.json +11 -0
- package/schema/fixtures/envelope/invalid/malformed-payload-hash.json +14 -0
- package/schema/fixtures/envelope/invalid/max-cost-bare-number.json +11 -0
- package/schema/fixtures/envelope/invalid/missing-origin.json +3 -0
- package/schema/fixtures/envelope/invalid/negative-est-cost.json +14 -0
- package/schema/fixtures/envelope/invalid/unknown-state.json +7 -0
- package/schema/fixtures/envelope/invalid/unknown-top-level-field.json +8 -0
- package/schema/fixtures/envelope/valid/action-payload-hash.json +17 -0
- package/schema/fixtures/envelope/valid/actions-without-budget.json +18 -0
- package/schema/fixtures/envelope/valid/canonical.json +25 -0
- package/schema/fixtures/envelope/valid/minimal.json +7 -0
- package/schema/fixtures/envelope/valid/multi-action-executed.json +30 -0
- package/schema/fixtures/envelope/valid/record-write-stage.json +22 -0
- package/schema/fixtures/event/invalid/approval-granted-agent-actor.json +15 -0
- package/schema/fixtures/event/invalid/approval-granted-empty-batch-delivery-id.json +17 -0
- package/schema/fixtures/event/invalid/approval-granted-fifth-reaction.json +16 -0
- package/schema/fixtures/event/invalid/approval-granted-missing-actor.json +14 -0
- package/schema/fixtures/event/invalid/approval-requested-missing-action-key.json +14 -0
- package/schema/fixtures/event/invalid/approval-withdrawn-agent-policy-drift.json +15 -0
- package/schema/fixtures/event/invalid/approval-withdrawn-missing-reason.json +15 -0
- package/schema/fixtures/event/invalid/approval-withdrawn-system-actor.json +15 -0
- package/schema/fixtures/event/invalid/audit-decision-refused-human-actor.json +17 -0
- package/schema/fixtures/event/invalid/audit-decision-refused-missing-code.json +16 -0
- package/schema/fixtures/event/invalid/audit-reviewed-agent-actor.json +15 -0
- package/schema/fixtures/event/invalid/audit-reviewed-loved-no-note.json +16 -0
- package/schema/fixtures/event/invalid/audit-reviewed-system-actor.json +15 -0
- package/schema/fixtures/event/invalid/bad-actor-prefix.json +15 -0
- package/schema/fixtures/event/invalid/est-cost-bare-number.json +17 -0
- package/schema/fixtures/event/invalid/execution-completed-fabricated-exit-code.json +16 -0
- package/schema/fixtures/event/invalid/execution-completed-provider-ref-empty-id.json +18 -0
- package/schema/fixtures/event/invalid/execution-completed-provider-ref-extra-field.json +19 -0
- package/schema/fixtures/event/invalid/execution-completed-provider-ref-id-not-string.json +18 -0
- package/schema/fixtures/event/invalid/execution-completed-provider-ref-missing-adapter.json +17 -0
- package/schema/fixtures/event/invalid/execution-failed-open-reported-by.json +16 -0
- package/schema/fixtures/event/invalid/execution-indeterminate-open-reason.json +14 -0
- package/schema/fixtures/event/invalid/execution-reconciled-agent-actor.json +17 -0
- package/schema/fixtures/event/invalid/execution-started-negative-env-stripped.json +16 -0
- package/schema/fixtures/event/invalid/gate-bypassed-missing-opened-seq.json +15 -0
- package/schema/fixtures/event/invalid/gate-closed-non-integer-opened-seq.json +13 -0
- package/schema/fixtures/event/invalid/gate-opened-agent-actor.json +16 -0
- package/schema/fixtures/event/invalid/gate-organ-attested-absolute-path.json +14 -0
- package/schema/fixtures/event/invalid/gate-organ-attested-agent-actor.json +14 -0
- package/schema/fixtures/event/invalid/gate-organ-attested-missing-organ-path.json +13 -0
- package/schema/fixtures/event/invalid/harness-unknown-kind.json +18 -0
- package/schema/fixtures/event/invalid/harness-version-multiline.json +16 -0
- package/schema/fixtures/event/invalid/log-checkpoint-agent-actor.json +17 -0
- package/schema/fixtures/event/invalid/log-checkpoint-missing-signature.json +16 -0
- package/schema/fixtures/event/invalid/log-checkpoint-short-signed-hash.json +17 -0
- package/schema/fixtures/event/invalid/log-checkpoint-unknown-signature-alg.json +17 -0
- package/schema/fixtures/event/invalid/malformed-ts.json +15 -0
- package/schema/fixtures/event/invalid/missing-alg.json +14 -0
- package/schema/fixtures/event/invalid/missing-hash.json +14 -0
- package/schema/fixtures/event/invalid/non-integer-seq.json +15 -0
- package/schema/fixtures/event/invalid/payload-pruned-human-actor.json +14 -0
- package/schema/fixtures/event/invalid/payload-pruned-missing-hash.json +14 -0
- package/schema/fixtures/event/invalid/policy-declined-agent-actor.json +15 -0
- package/schema/fixtures/event/invalid/policy-proposed-missing-diff.json +19 -0
- package/schema/fixtures/event/invalid/policy-proposed-system-actor.json +26 -0
- package/schema/fixtures/event/invalid/short-hash.json +15 -0
- package/schema/fixtures/event/invalid/unknown-alg.json +15 -0
- package/schema/fixtures/event/invalid/unknown-event-type.json +15 -0
- package/schema/fixtures/event/invalid/unknown-top-level-field.json +16 -0
- package/schema/fixtures/event/valid/approval-expired.json +15 -0
- package/schema/fixtures/event/valid/approval-granted-batch.json +19 -0
- package/schema/fixtures/event/valid/approval-granted-reaction.json +16 -0
- package/schema/fixtures/event/valid/approval-granted.json +15 -0
- package/schema/fixtures/event/valid/approval-rejected.json +15 -0
- package/schema/fixtures/event/valid/approval-requested.json +19 -0
- package/schema/fixtures/event/valid/approval-revoked.json +15 -0
- package/schema/fixtures/event/valid/approval-withdrawn-policy-drift.json +17 -0
- package/schema/fixtures/event/valid/approval-withdrawn.json +16 -0
- package/schema/fixtures/event/valid/audit-decision-refused.json +20 -0
- package/schema/fixtures/event/valid/audit-reviewed-reaction.json +17 -0
- package/schema/fixtures/event/valid/audit-reviewed.json +15 -0
- package/schema/fixtures/event/valid/audit-sampled.json +14 -0
- package/schema/fixtures/event/valid/budget-exceeded.json +21 -0
- package/schema/fixtures/event/valid/envelope-drift.json +16 -0
- package/schema/fixtures/event/valid/execution-completed-harness-report.json +16 -0
- package/schema/fixtures/event/valid/execution-completed-provider-ref.json +18 -0
- package/schema/fixtures/event/valid/execution-completed.json +15 -0
- package/schema/fixtures/event/valid/execution-failed-harness-report.json +16 -0
- package/schema/fixtures/event/valid/execution-failed.json +15 -0
- package/schema/fixtures/event/valid/execution-indeterminate.json +15 -0
- package/schema/fixtures/event/valid/execution-reconciled.json +17 -0
- package/schema/fixtures/event/valid/execution-started-env-stripped.json +17 -0
- package/schema/fixtures/event/valid/execution-started.json +14 -0
- package/schema/fixtures/event/valid/gate-bypassed-harness-version.json +18 -0
- package/schema/fixtures/event/valid/gate-bypassed.json +19 -0
- package/schema/fixtures/event/valid/gate-closed.json +14 -0
- package/schema/fixtures/event/valid/gate-opened.json +16 -0
- package/schema/fixtures/event/valid/gate-organ-attested.json +14 -0
- package/schema/fixtures/event/valid/genesis-null-prev.json +14 -0
- package/schema/fixtures/event/valid/log-checkpoint.json +17 -0
- package/schema/fixtures/event/valid/payload-pruned-orphan.json +13 -0
- package/schema/fixtures/event/valid/payload-pruned.json +17 -0
- package/schema/fixtures/event/valid/policy-declined.json +16 -0
- package/schema/fixtures/event/valid/policy-proposed.json +35 -0
- package/schema/fixtures/event/valid/policy-updated.json +14 -0
- package/schema/fixtures/event/valid/reconciliation-required.json +18 -0
- package/schema/fixtures/event/valid/reconciliation-satisfied.json +17 -0
- package/schema/fixtures/event/valid/route-accepted.json +15 -0
- package/schema/fixtures/event/valid/route-proposed.json +16 -0
- package/schema/fixtures/event/valid/spec-example.json +15 -0
- package/schema/fixtures/event/valid/task-registered-harness-version.json +23 -0
- package/schema/fixtures/event/valid/task-registered.json +14 -0
- package/schema/fixtures/hash/known-answer-pre-121.json +74 -0
- package/schema/fixtures/hash/known-answer.json +74 -0
- package/schema/fixtures/policy/invalid/bad-approval-ttl.json +7 -0
- package/schema/fixtures/policy/invalid/bad-web-port.json +4 -0
- package/schema/fixtures/policy/invalid/checkpoint-key-not-base64.json +6 -0
- package/schema/fixtures/policy/invalid/class-rule-missing-autonomy.json +9 -0
- package/schema/fixtures/policy/invalid/empty-class-key.json +6 -0
- package/schema/fixtures/policy/invalid/live-rate-on-human-only.json +7 -0
- package/schema/fixtures/policy/invalid/malformed-class-key.json +6 -0
- package/schema/fixtures/policy/invalid/missing-version.json +8 -0
- package/schema/fixtures/policy/invalid/negative-limit.json +9 -0
- package/schema/fixtures/policy/invalid/non-numeric-limit.json +9 -0
- package/schema/fixtures/policy/invalid/non-positive-max-pending.json +9 -0
- package/schema/fixtures/policy/invalid/on-expiry-grant.json +8 -0
- package/schema/fixtures/policy/invalid/payload-retention-bare-number.json +4 -0
- package/schema/fixtures/policy/invalid/payload-retention-compound.json +4 -0
- package/schema/fixtures/policy/invalid/payload-retention-fractional.json +4 -0
- package/schema/fixtures/policy/invalid/payload-retention-zero.json +4 -0
- package/schema/fixtures/policy/invalid/protected-paths-escape.json +4 -0
- package/schema/fixtures/policy/invalid/protected-paths-glob.json +4 -0
- package/schema/fixtures/policy/invalid/retro-rate-on-human-only.json +7 -0
- package/schema/fixtures/policy/invalid/retro-rate-on-manual.json +7 -0
- package/schema/fixtures/policy/invalid/retro-rate-zero.json +7 -0
- package/schema/fixtures/policy/invalid/sample-rate-too-high.json +5 -0
- package/schema/fixtures/policy/invalid/sampling-secret-env-empty.json +7 -0
- package/schema/fixtures/policy/invalid/sampling-secret-env-not-string.json +6 -0
- package/schema/fixtures/policy/invalid/skew-tolerance-compound.json +6 -0
- package/schema/fixtures/policy/invalid/unknown-autonomy.json +7 -0
- package/schema/fixtures/policy/invalid/unknown-class-rule-key.json +6 -0
- package/schema/fixtures/policy/invalid/unknown-top-level-key.json +7 -0
- package/schema/fixtures/policy/invalid/vault-passphrase-env-empty.json +6 -0
- package/schema/fixtures/policy/invalid/vault-passphrase-literal.json +6 -0
- package/schema/fixtures/policy/invalid/version-not-string.json +4 -0
- package/schema/fixtures/policy/valid/canonical.json +47 -0
- package/schema/fixtures/policy/valid/checkpoint-keys.json +18 -0
- package/schema/fixtures/policy/valid/class-approvers-limits.json +25 -0
- package/schema/fixtures/policy/valid/class-retro-rate.json +17 -0
- package/schema/fixtures/policy/valid/global-budgets.json +19 -0
- package/schema/fixtures/policy/valid/human-only.json +9 -0
- package/schema/fixtures/policy/valid/minimal.json +6 -0
- package/schema/fixtures/policy/valid/protected-paths.json +10 -0
- package/schema/fixtures/policy/valid/record-namespace.json +13 -0
- package/schema/fixtures/policy/valid/request-volume-limits.json +26 -0
- package/schema/fixtures/policy/valid/retention-and-sampling-secret.json +16 -0
- package/schema/fixtures/policy/valid/skew-tolerance.json +15 -0
- package/schema/fixtures/policy/valid/vault-passphrase-env.json +14 -0
- package/schema/fixtures/policy/valid/wildcards.json +15 -0
- package/schema/fixtures/policy-md/invalid/alias-bomb.md +15 -0
- package/schema/fixtures/policy-md/invalid/no-fence.md +7 -0
- package/schema/fixtures/policy-md/invalid/protected-route-not-a-subclass.md +16 -0
- package/schema/fixtures/policy-md/invalid/schema-invalid-autonomy.md +16 -0
- package/schema/fixtures/policy-md/invalid/schema-invalid-read-proof.md +17 -0
- package/schema/fixtures/policy-md/invalid/two-fences.md +19 -0
- package/schema/fixtures/policy-md/invalid/unclosed-fence.md +11 -0
- package/schema/fixtures/policy-md/invalid/wrong-info-string.md +11 -0
- package/schema/fixtures/policy-md/invalid/yaml-syntax-error.md +13 -0
- package/schema/fixtures/policy-md/precedence/both/APPROVAL.md +7 -0
- package/schema/fixtures/policy-md/precedence/both/APPROVALS.md +7 -0
- package/schema/fixtures/policy-md/precedence/fallback-only/APPROVALS.md +7 -0
- package/schema/fixtures/policy-md/valid/canonical.md +50 -0
- package/schema/fixtures/policy-md/valid/daemon-read-proof.md +18 -0
- package/schema/fixtures/policy-md/valid/minimal.md +3 -0
- package/schema/fixtures/policy-md/valid/prose-lookalikes.md +54 -0
- package/schema/fixtures/policy-md/valid/routed-protected-paths.md +49 -0
- package/schema/fixtures/policy-md/valid/with-values.md +79 -0
- package/schema/fixtures/sample-record/invalid/bad-date-time.json +4 -0
- package/schema/fixtures/sample-record/invalid/missing-required-field.json +3 -0
- package/schema/fixtures/sample-record/invalid/unknown-top-level-field.json +5 -0
- package/schema/fixtures/sample-record/invalid/wrong-type.json +4 -0
- package/schema/fixtures/sample-record/valid/minimal.json +4 -0
- package/schema/fixtures/sample-record/valid/with-note.json +5 -0
- package/schema/fixtures/values/invalid/class-shaped.json +9 -0
- package/schema/fixtures/values/invalid/duplicate-entry.json +4 -0
- package/schema/fixtures/values/invalid/non-string-item.json +4 -0
- package/schema/fixtures/values/invalid/over-cap.json +26 -0
- package/schema/fixtures/values/invalid/unknown-key.json +5 -0
- package/schema/fixtures/values/invalid/version-string.json +1 -0
- package/schema/fixtures/values/valid/empty-lists.json +7 -0
- package/schema/fixtures/values/valid/full.json +20 -0
- package/schema/fixtures/values/valid/minimal.json +1 -0
- package/schema/fixtures/values-md/invalid/schema-invalid.md +62 -0
- package/schema/fixtures/values-md/invalid/two-blocks.md +69 -0
- package/schema/fixtures/values-md/invalid/unterminated.md +61 -0
- package/schema/fixtures/values-md/invalid/yaml-error.md +63 -0
- package/schema/fixtures/values-md/valid/absent.md +50 -0
- package/schema/fixtures/values-md/valid/with-values.md +79 -0
- package/schema/policy.schema.json +501 -0
- package/schema/sample-record.schema.json +26 -0
- package/schema/values.schema.json +55 -0
- package/templates/codex/README.md +9 -0
|
@@ -0,0 +1,549 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hash-chain verification for `.approval/log/events.jsonl` (SPEC.md §8:
|
|
3
|
+
* "`approval log verify` MUST detect any mutation or truncation").
|
|
4
|
+
*
|
|
5
|
+
* This module is the read side of the append-only log. It re-derives every
|
|
6
|
+
* record's digest from its canonical serialization and walks the `prev` chain
|
|
7
|
+
* and the `seq` succession end to end, reporting the *first* place the log
|
|
8
|
+
* stops being self-consistent.
|
|
9
|
+
*
|
|
10
|
+
* **Read-only, by definition.** Verification opens the log for reading and
|
|
11
|
+
* nothing else: it never truncates, never rewrites, never repairs, and never
|
|
12
|
+
* creates a lockfile. A torn tail is *reported*, never auto-truncated — a log
|
|
13
|
+
* that heals itself is a log that can be made to forget. Repair is a human
|
|
14
|
+
* decision, made explicitly: a later CLI task may offer it behind an explicit
|
|
15
|
+
* flag, but the core provides detection only.
|
|
16
|
+
*
|
|
17
|
+
* **What verification detects.** Any mutation of a record without a full
|
|
18
|
+
* recompute of every descendant; truncation of the tail (with an external
|
|
19
|
+
* anchor); deletion, insertion, reorder, or splice anywhere in the chain;
|
|
20
|
+
* `alg` tampering; a malformed or schema-invalid line; a duplicated or skipped
|
|
21
|
+
* `seq`; a non-genesis first record; and — given an anchor — a fully
|
|
22
|
+
* recomputed forged suffix.
|
|
23
|
+
*
|
|
24
|
+
* **The detection boundary — state it plainly.** A hash chain is
|
|
25
|
+
* tamper-*evident*, not tamper-*proof*. A forger who rewrites record N and then
|
|
26
|
+
* recomputes every descendant (new hash, fixed `prev`) produces a file that is
|
|
27
|
+
* internally self-consistent in every respect, and `verify(logPath)` on that
|
|
28
|
+
* file alone CANNOT distinguish it from an honest log. The same is true of
|
|
29
|
+
* dropping records off the tail: the surviving prefix is a valid chain. Closing
|
|
30
|
+
* that gap requires something the forger does not control:
|
|
31
|
+
*
|
|
32
|
+
* - an externally anchored head — pass {@link VerifyOptions.expectedHead} with
|
|
33
|
+
* a `(seq, hash)` pair recorded elsewhere (a channel message, another host, a
|
|
34
|
+
* human's notes); a mismatch is reported as `head-mismatch`;
|
|
35
|
+
* - a retained copy of the log held outside the writer's reach;
|
|
36
|
+
* - the optional per-event git commits of SPEC.md §8, where the daemon commits
|
|
37
|
+
* each record under its own identity, giving signed, distributed evidence.
|
|
38
|
+
*
|
|
39
|
+
* Three questions that keep arriving separately have one answer (APRV-141, F7):
|
|
40
|
+
* the digest covers each record's CANONICAL CONTENT, its RFC 8785
|
|
41
|
+
* serialization, and never the bytes of the line it was read from, so a
|
|
42
|
+
* re-serialization that changes only byte format verifies clean, a line
|
|
43
|
+
* carrying a duplicate key is settled by the JSON parse that precedes
|
|
44
|
+
* canonicalization rather than by the chain, and an unanchored tail truncation
|
|
45
|
+
* leaves a valid prefix that nothing inside the file can contradict.
|
|
46
|
+
*
|
|
47
|
+
* **Anomalies, which are reported and never enforced (APRV-40).** SPEC.md §8
|
|
48
|
+
* requires that "verification treats gate-type events with implausible skew
|
|
49
|
+
* relative to their neighbors as a reportable anomaly, never silently accepted".
|
|
50
|
+
* Every non-corrupt result therefore carries {@link VerifyResult.anomalies}, a
|
|
51
|
+
* list that says nothing about integrity: a clean log with anomalies is clean,
|
|
52
|
+
* exits 0, and authorizes exactly what it authorized before. The separation is
|
|
53
|
+
* the point. Chain integrity is a proof, skew is a judgment, and folding a
|
|
54
|
+
* judgment into a proof would turn `log verify` into a check people learn to
|
|
55
|
+
* pass a flag to silence. See {@link chainAnomalies}.
|
|
56
|
+
*
|
|
57
|
+
* Determinism: the result is a pure function of (log bytes, schema files,
|
|
58
|
+
* options). No clock, no network, no cross-call state — the anomaly pass reads
|
|
59
|
+
* the records' own timestamps and never the current time.
|
|
60
|
+
*/
|
|
61
|
+
import { readFileSync } from "node:fs";
|
|
62
|
+
import { ALG, computeRecordHash } from "./log.js";
|
|
63
|
+
import { loadPolicy } from "./policy-load.js";
|
|
64
|
+
import { prepareValidator } from "./validate.js";
|
|
65
|
+
// ---------------------------------------------------------------------------
|
|
66
|
+
// Anomalies (SPEC.md §8, timestamp rules) — reportable, never a verdict
|
|
67
|
+
// ---------------------------------------------------------------------------
|
|
68
|
+
/**
|
|
69
|
+
* SPEC.md §8: "Events written through the gate (`approval.*`, `execution.*`,
|
|
70
|
+
* `budget.*`, `audit.*`, `policy.updated`) have `ts` assigned by the runtime at
|
|
71
|
+
* the write boundary."
|
|
72
|
+
*
|
|
73
|
+
* These are the types whose timestamps the runtime authored, so these are the
|
|
74
|
+
* only types whose timestamps the runtime may be held to. Every other type is
|
|
75
|
+
* writable directly by callers who legitimately supply their own `ts` (an
|
|
76
|
+
* importer replaying a historical log is the obvious case), so comparing them
|
|
77
|
+
* would manufacture anomalies out of correct behavior.
|
|
78
|
+
*/
|
|
79
|
+
function isGateTyped(event) {
|
|
80
|
+
return (event.startsWith("approval.") ||
|
|
81
|
+
event.startsWith("execution.") ||
|
|
82
|
+
event.startsWith("budget.") ||
|
|
83
|
+
event.startsWith("audit.") ||
|
|
84
|
+
// Amended SPEC.md §8 (APRV-127): `reconciliation.*` is written through the
|
|
85
|
+
// gate for the same reason `audit.*` is. The obligation is appended by the
|
|
86
|
+
// runtime as a consequence of a human's denial and the satisfaction is a
|
|
87
|
+
// human's act recorded at the write boundary; neither takes a caller's
|
|
88
|
+
// clock, so both may be held to the runtime's.
|
|
89
|
+
event.startsWith("reconciliation.") ||
|
|
90
|
+
// Amended SPEC.md §8 (APRV-214): `gate.*` is written through the write
|
|
91
|
+
// boundary clock like everything above it. The open window's expiry is
|
|
92
|
+
// derived from `gate.opened`'s own `ts`, so an opener who could author that
|
|
93
|
+
// timestamp could author the window's length; holding the trio to the
|
|
94
|
+
// runtime's clock is what makes §8's skew report cover it.
|
|
95
|
+
event.startsWith("gate.") ||
|
|
96
|
+
// Amended SPEC.md §8/§9 (APRV-220): a checkpoint's whole content is a claim
|
|
97
|
+
// about a moment — "this head was signed then" — so its `ts` is stamped at
|
|
98
|
+
// the write boundary, and a signer who could author it could backdate the
|
|
99
|
+
// one record whose value is when it was taken.
|
|
100
|
+
event === "log.checkpoint" ||
|
|
101
|
+
event === "policy.updated");
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* The skew allowance, in milliseconds, before a backwards step between two
|
|
105
|
+
* gate-typed records is reported.
|
|
106
|
+
*
|
|
107
|
+
* ### Why 2 seconds, and why any number at all
|
|
108
|
+
*
|
|
109
|
+
* Gate-typed timestamps are stamped by `core/clock.ts` at the write boundary. In
|
|
110
|
+
* one process they come from one `Date.now()` and never go backwards. Across
|
|
111
|
+
* processes and hosts — the daemon on one machine, a CLI verb on another, both
|
|
112
|
+
* appending to a shared log — they come from separate wall clocks, and two
|
|
113
|
+
* healthy NTP-disciplined clocks routinely disagree by tens of milliseconds and
|
|
114
|
+
* occasionally by a few hundred during a step correction. A tolerance of zero
|
|
115
|
+
* would therefore report ordinary distributed operation as an anomaly, which is
|
|
116
|
+
* the fastest way to make an anomaly channel ignored.
|
|
117
|
+
*
|
|
118
|
+
* 2000 ms is chosen as roughly an order of magnitude above the disagreement a
|
|
119
|
+
* synchronized fleet actually exhibits, and two to three orders of magnitude
|
|
120
|
+
* below the skew that a *useful* lie requires. The thing this check exists to
|
|
121
|
+
* catch is a timestamp placed to change a judgment: a `ts` inside a lapsed TTL
|
|
122
|
+
* (minutes to hours), or one moved outside a rolling budget window (hours). No
|
|
123
|
+
* attack is bought by 1.9 seconds, and no healthy fleet needs 2.1.
|
|
124
|
+
*
|
|
125
|
+
* It is the DEFAULT rather than the only value since APRV-58: an operator
|
|
126
|
+
* running a single host may tighten it to 250 ms, one running across a WAN with
|
|
127
|
+
* poor time discipline may loosen it to 5 s, and `audit.skew_tolerance` in the
|
|
128
|
+
* policy is where they say so. A policy that declares nothing (or that fails to
|
|
129
|
+
* load at all) leaves this number in force, so the reference runtime still has
|
|
130
|
+
* exactly one value that every reader can see.
|
|
131
|
+
*
|
|
132
|
+
* Widening the tolerance permits nothing: the threshold is report-only in both
|
|
133
|
+
* directions, so a loosened value hides evidence from a human and cannot make
|
|
134
|
+
* any action allowed that was refused before.
|
|
135
|
+
*/
|
|
136
|
+
export const GATE_TS_SKEW_TOLERANCE_MS = 2_000;
|
|
137
|
+
/**
|
|
138
|
+
* `audit.skew_tolerance` in milliseconds, or the default when it says nothing.
|
|
139
|
+
*
|
|
140
|
+
* Fails closed to the default exactly as `daemon/prune.ts`'s retention read
|
|
141
|
+
* does: a policy that cannot be loaded configures nothing, and for THIS key the
|
|
142
|
+
* safe fallback is the shipped number rather than zero — a zero allowance would
|
|
143
|
+
* report every ordinary clock disagreement as an anomaly, and an anomaly channel
|
|
144
|
+
* that cries wolf is one operators stop reading. An unparseable duration never
|
|
145
|
+
* reaches here: the schema's duration pattern rejects it and `loadPolicy` fails
|
|
146
|
+
* the whole policy, precisely as a bad `defaults.approval_ttl` does.
|
|
147
|
+
*/
|
|
148
|
+
export function skewToleranceMsOf(policy, schemaDir) {
|
|
149
|
+
const where = policy.file !== undefined ? { file: policy.file } : { dir: policy.dir ?? process.cwd() };
|
|
150
|
+
if (schemaDir !== undefined)
|
|
151
|
+
where.schemaDir = schemaDir;
|
|
152
|
+
const load = loadPolicy(where);
|
|
153
|
+
if (!load.ok)
|
|
154
|
+
return GATE_TS_SKEW_TOLERANCE_MS;
|
|
155
|
+
return load.durations.skewToleranceMs ?? GATE_TS_SKEW_TOLERANCE_MS;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Machine-readable anomaly kinds. Closed union, additive-only, each pinned by a
|
|
159
|
+
* test — the same contract every other frozen union in this codebase carries.
|
|
160
|
+
*/
|
|
161
|
+
export const CHAIN_ANOMALY_KINDS = [
|
|
162
|
+
/**
|
|
163
|
+
* A gate-typed record's `ts` is earlier than the previous gate-typed record's
|
|
164
|
+
* `ts` by more than {@link GATE_TS_SKEW_TOLERANCE_MS}.
|
|
165
|
+
*
|
|
166
|
+
* One kind covers both directions SPEC.md §8 describes. "Earlier than its
|
|
167
|
+
* predecessor" and "later than its successor" are the same disagreement seen
|
|
168
|
+
* from the two ends of one adjacent pair, and reporting it twice would double
|
|
169
|
+
* every entry without adding a fact.
|
|
170
|
+
*/
|
|
171
|
+
"gate-ts-regression",
|
|
172
|
+
];
|
|
173
|
+
/**
|
|
174
|
+
* Timestamp anomalies among the gate-typed records of a verified chain.
|
|
175
|
+
*
|
|
176
|
+
* Pure: a function of the records alone, with no clock and no I/O. Comparison is
|
|
177
|
+
* between each gate-typed record and the previous **gate-typed** record, not the
|
|
178
|
+
* previous record of any kind, for the reason {@link isGateTyped} states.
|
|
179
|
+
*
|
|
180
|
+
* This changes no verdict. A log full of anomalies is still `clean` if its chain
|
|
181
|
+
* verifies, still exits 0, and still authorizes exactly what it authorized
|
|
182
|
+
* before. Skew is evidence for a human to weigh, and a verifier that refused on
|
|
183
|
+
* it would be refusing on a heuristic — which is how a tamper-evidence tool
|
|
184
|
+
* starts being run with a flag that turns it off.
|
|
185
|
+
*/
|
|
186
|
+
export function chainAnomalies(records, toleranceMs = GATE_TS_SKEW_TOLERANCE_MS) {
|
|
187
|
+
const anomalies = [];
|
|
188
|
+
let previous = null;
|
|
189
|
+
for (const record of records) {
|
|
190
|
+
if (!isGateTyped(record.event))
|
|
191
|
+
continue;
|
|
192
|
+
const millis = Date.parse(record.ts);
|
|
193
|
+
if (Number.isNaN(millis))
|
|
194
|
+
continue; // the schema's date-time format precedes this
|
|
195
|
+
if (previous !== null) {
|
|
196
|
+
const skewMs = previous.millis - millis;
|
|
197
|
+
if (skewMs > toleranceMs) {
|
|
198
|
+
anomalies.push({
|
|
199
|
+
kind: "gate-ts-regression",
|
|
200
|
+
seq: record.seq,
|
|
201
|
+
ts: record.ts,
|
|
202
|
+
event: record.event,
|
|
203
|
+
previousSeq: previous.seq,
|
|
204
|
+
previousTs: previous.ts,
|
|
205
|
+
skewMs,
|
|
206
|
+
message: `record ${record.seq} (${record.event}) is timestamped ${record.ts}, ${String(skewMs)}ms BEFORE the previous gate-typed record ${previous.seq} at ${previous.ts}. Gate-typed timestamps are stamped by the runtime at the write boundary (SPEC.md §8), so a backwards step larger than ${String(toleranceMs)}ms means either a clock that stepped backwards or a timestamp that was authored rather than stamped. The chain still verifies and nothing is refused: this is reported for a human to weigh, because TTL judgment and budget windows read ts.`,
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
previous = { seq: record.seq, ts: record.ts, millis };
|
|
211
|
+
}
|
|
212
|
+
return anomalies;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* How many records pass between progress calls.
|
|
216
|
+
*
|
|
217
|
+
* Count-based rather than time-based, and reported here rather than throttled
|
|
218
|
+
* here: this module has no clock, a listener that fires on a deterministic
|
|
219
|
+
* schedule is a listener a test can assert on exactly, and the decision about
|
|
220
|
+
* how often a HUMAN should see a repaint belongs to the thing holding the
|
|
221
|
+
* terminal (`cli/progress.ts`), which is the only layer that knows whether
|
|
222
|
+
* there is one.
|
|
223
|
+
*/
|
|
224
|
+
export const PROGRESS_INTERVAL = 250;
|
|
225
|
+
/** The tolerance a verification run should apply, from its options alone. */
|
|
226
|
+
function toleranceOf(options) {
|
|
227
|
+
if (options.skewToleranceMs !== undefined)
|
|
228
|
+
return options.skewToleranceMs;
|
|
229
|
+
if (options.policy === undefined)
|
|
230
|
+
return GATE_TS_SKEW_TOLERANCE_MS;
|
|
231
|
+
return skewToleranceMsOf(options.policy, options.schemaDir);
|
|
232
|
+
}
|
|
233
|
+
function corrupt(reason, firstBadSeq, message) {
|
|
234
|
+
// A chain that does not verify gets no anomaly report. Anomalies are a
|
|
235
|
+
// secondary reading of records the walk vouched for, and reading timestamps
|
|
236
|
+
// off a log whose integrity is in question would dress up untrusted bytes as
|
|
237
|
+
// findings. The corruption is the finding.
|
|
238
|
+
return { status: "corrupt", firstBadSeq, reason, message, anomalies: [] };
|
|
239
|
+
}
|
|
240
|
+
/** `seq` as reported by a raw parsed line, or `null` when unusable. */
|
|
241
|
+
function readSeq(record) {
|
|
242
|
+
const seq = record["seq"];
|
|
243
|
+
return typeof seq === "number" && Number.isInteger(seq) && seq >= 1 ? seq : null;
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Split the raw file into complete lines plus an optional torn tail.
|
|
247
|
+
*
|
|
248
|
+
* A torn tail is *only* an unterminated final segment. {@link appendEvent}
|
|
249
|
+
* writes `line + "\n"` in a single `write(2)` on an `O_APPEND` handle, so a
|
|
250
|
+
* crashed writer can leave a partial line but cannot leave a complete,
|
|
251
|
+
* newline-terminated line that is malformed. A malformed line that *is*
|
|
252
|
+
* newline-terminated is therefore corruption, not a torn write, and is reported
|
|
253
|
+
* as such wherever it appears — final line included.
|
|
254
|
+
*/
|
|
255
|
+
function splitLines(raw) {
|
|
256
|
+
const segments = raw.split("\n");
|
|
257
|
+
const last = segments[segments.length - 1] ?? "";
|
|
258
|
+
if (last.length === 0) {
|
|
259
|
+
segments.pop(); // the empty segment after the final newline
|
|
260
|
+
return { complete: segments, torn: null };
|
|
261
|
+
}
|
|
262
|
+
segments.pop();
|
|
263
|
+
return { complete: segments, torn: last };
|
|
264
|
+
}
|
|
265
|
+
const GENESIS_START = { prevSeq: 0, prevHash: null, lineNumberBase: 0 };
|
|
266
|
+
/**
|
|
267
|
+
* Walk `lines` as a hash chain. Returns `null` when the whole prefix verifies,
|
|
268
|
+
* otherwise the first failure.
|
|
269
|
+
*
|
|
270
|
+
* Check order per record — earlier checks report the more specific reason:
|
|
271
|
+
*
|
|
272
|
+
* 1. the line parses as a JSON object (`malformed-line`);
|
|
273
|
+
* 2. `alg` is exactly `sha256/jcs` (`bad-alg`). Checked *before* the schema so
|
|
274
|
+
* a missing or unrecognized scheme identifier — which SPEC.md §8 requires
|
|
275
|
+
* verifiers to reject by name — reports `bad-alg` rather than generic
|
|
276
|
+
* schema noise;
|
|
277
|
+
* 3. the record validates against the `event` schema (`schema-invalid`);
|
|
278
|
+
* 4. the recomputed digest equals `hash` (`hash-mismatch`);
|
|
279
|
+
* 5. `seq` is exactly the predecessor's `seq` + 1, and 1 for the first record
|
|
280
|
+
* (`seq-duplicate` when it repeats the predecessor, else `seq-gap`);
|
|
281
|
+
* 6. `prev` is the predecessor's `hash`, and `null` for the first record
|
|
282
|
+
* (`prev-mismatch`, or `not-genesis` for a first record with a non-null
|
|
283
|
+
* `prev`).
|
|
284
|
+
*
|
|
285
|
+
* Fails closed throughout: anything that cannot be shown to be sound is a
|
|
286
|
+
* failure, never a pass.
|
|
287
|
+
*/
|
|
288
|
+
function walk(lines, validateOptions, start,
|
|
289
|
+
/**
|
|
290
|
+
* Called with the number of lines consumed so far, every
|
|
291
|
+
* {@link PROGRESS_INTERVAL} records (APRV-167). Purely observational; see
|
|
292
|
+
* {@link VerifyOptions.onProgress}.
|
|
293
|
+
*/
|
|
294
|
+
report = null) {
|
|
295
|
+
let prevSeq = start.prevSeq;
|
|
296
|
+
let prevHash = start.prevHash;
|
|
297
|
+
const verified = [];
|
|
298
|
+
// Compiled once, on the first record that needs it, and reused for every
|
|
299
|
+
// record after: a per-record recompile is what turned a cold walk of a few
|
|
300
|
+
// thousand records into minutes of CPU (APRV-186). Lazy so that a walk over
|
|
301
|
+
// zero lines still never touches the schema directory, exactly as before.
|
|
302
|
+
let eventValidator = null;
|
|
303
|
+
for (const [index, line] of lines.entries()) {
|
|
304
|
+
const lineNumber = start.lineNumberBase + index + 1;
|
|
305
|
+
if (line.trim().length === 0) {
|
|
306
|
+
return {
|
|
307
|
+
failure: corrupt("malformed-line", null, `line ${lineNumber} is blank`),
|
|
308
|
+
head: null,
|
|
309
|
+
records: verified,
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
let parsed;
|
|
313
|
+
try {
|
|
314
|
+
parsed = JSON.parse(line);
|
|
315
|
+
}
|
|
316
|
+
catch (cause) {
|
|
317
|
+
const detail = cause instanceof Error ? cause.message : String(cause);
|
|
318
|
+
return {
|
|
319
|
+
failure: corrupt("malformed-line", null, `line ${lineNumber} is not valid JSON: ${detail}`),
|
|
320
|
+
head: null,
|
|
321
|
+
records: verified,
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
|
|
325
|
+
return {
|
|
326
|
+
failure: corrupt("malformed-line", null, `line ${lineNumber} is not a JSON object`),
|
|
327
|
+
head: null,
|
|
328
|
+
records: verified,
|
|
329
|
+
};
|
|
330
|
+
}
|
|
331
|
+
const raw = parsed;
|
|
332
|
+
const seq = readSeq(raw);
|
|
333
|
+
if (raw["alg"] !== ALG) {
|
|
334
|
+
const found = raw["alg"] === undefined ? "missing" : JSON.stringify(raw["alg"]);
|
|
335
|
+
return {
|
|
336
|
+
failure: corrupt("bad-alg", seq, `line ${lineNumber}: hash-scheme identifier "alg" is ${found}, expected "${ALG}"`),
|
|
337
|
+
head: null,
|
|
338
|
+
records: verified,
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
eventValidator ??= prepareValidator("event", validateOptions);
|
|
342
|
+
const validation = eventValidator.ok ? eventValidator.check(raw) : eventValidator;
|
|
343
|
+
if (!validation.ok) {
|
|
344
|
+
const detail = validation.errors
|
|
345
|
+
.map((error) => `${error.path === "" ? "/" : error.path} ${error.message}`)
|
|
346
|
+
.join("; ");
|
|
347
|
+
return {
|
|
348
|
+
failure: corrupt("schema-invalid", seq, `line ${lineNumber} does not validate against the event schema: ${detail}`),
|
|
349
|
+
head: null,
|
|
350
|
+
records: verified,
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
// Schema-valid: the chain fields are now known to have their declared shapes.
|
|
354
|
+
const record = raw;
|
|
355
|
+
let recomputed;
|
|
356
|
+
try {
|
|
357
|
+
recomputed = computeRecordHash(record);
|
|
358
|
+
}
|
|
359
|
+
catch (cause) {
|
|
360
|
+
const detail = cause instanceof Error ? cause.message : String(cause);
|
|
361
|
+
return {
|
|
362
|
+
failure: corrupt("hash-mismatch", record.seq, `record ${record.seq} could not be canonicalized for hashing: ${detail}`),
|
|
363
|
+
head: null,
|
|
364
|
+
records: verified,
|
|
365
|
+
};
|
|
366
|
+
}
|
|
367
|
+
if (recomputed !== record.hash) {
|
|
368
|
+
return {
|
|
369
|
+
failure: corrupt("hash-mismatch", record.seq, `record ${record.seq} hash ${record.hash} does not match its contents (recomputed ${recomputed})`),
|
|
370
|
+
head: null,
|
|
371
|
+
records: verified,
|
|
372
|
+
};
|
|
373
|
+
}
|
|
374
|
+
if (record.seq !== prevSeq + 1) {
|
|
375
|
+
const duplicate = prevSeq > 0 && record.seq === prevSeq;
|
|
376
|
+
return {
|
|
377
|
+
failure: corrupt(duplicate ? "seq-duplicate" : "seq-gap", record.seq, duplicate
|
|
378
|
+
? `line ${lineNumber} repeats seq ${record.seq}`
|
|
379
|
+
: `line ${lineNumber} has seq ${record.seq}, expected ${prevSeq + 1}`),
|
|
380
|
+
head: null,
|
|
381
|
+
records: verified,
|
|
382
|
+
};
|
|
383
|
+
}
|
|
384
|
+
if (prevHash === null) {
|
|
385
|
+
if (record.prev !== null) {
|
|
386
|
+
return {
|
|
387
|
+
failure: corrupt("not-genesis", record.seq, `record ${record.seq} is the first record but its prev is ${JSON.stringify(record.prev)}, expected null`),
|
|
388
|
+
head: null,
|
|
389
|
+
records: verified,
|
|
390
|
+
};
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
else if (record.prev !== prevHash) {
|
|
394
|
+
return {
|
|
395
|
+
failure: corrupt("prev-mismatch", record.seq, `record ${record.seq} prev ${JSON.stringify(record.prev)} does not link to record ${prevSeq} hash ${prevHash}`),
|
|
396
|
+
head: null,
|
|
397
|
+
records: verified,
|
|
398
|
+
};
|
|
399
|
+
}
|
|
400
|
+
prevSeq = record.seq;
|
|
401
|
+
prevHash = record.hash;
|
|
402
|
+
verified.push(record);
|
|
403
|
+
if (report !== null && (index + 1) % PROGRESS_INTERVAL === 0)
|
|
404
|
+
report(index + 1);
|
|
405
|
+
}
|
|
406
|
+
return {
|
|
407
|
+
failure: null,
|
|
408
|
+
head: prevHash === null ? null : { seq: prevSeq, hash: prevHash },
|
|
409
|
+
records: verified,
|
|
410
|
+
};
|
|
411
|
+
}
|
|
412
|
+
/**
|
|
413
|
+
* {@link verify}, returning the verified records alongside the verdict.
|
|
414
|
+
*
|
|
415
|
+
* This exists so that a reader which needs *both* — the gate, the token module,
|
|
416
|
+
* the executor, via `core/state.ts` — can have one walk produce both, rather
|
|
417
|
+
* than verifying with this module and then parsing the same bytes a second time
|
|
418
|
+
* with a private walk that could disagree with it (APRV-20 finding S1).
|
|
419
|
+
*/
|
|
420
|
+
export function verifyWithRecords(logPath, options = {}) {
|
|
421
|
+
let raw;
|
|
422
|
+
try {
|
|
423
|
+
raw = readFileSync(logPath, "utf8");
|
|
424
|
+
}
|
|
425
|
+
catch (cause) {
|
|
426
|
+
if (cause.code !== "ENOENT") {
|
|
427
|
+
const detail = cause instanceof Error ? cause.message : String(cause);
|
|
428
|
+
return {
|
|
429
|
+
result: corrupt("malformed-line", null, `log ${logPath} could not be read: ${detail}`),
|
|
430
|
+
records: [],
|
|
431
|
+
};
|
|
432
|
+
}
|
|
433
|
+
// An absent file is an empty log — but it still has to satisfy an anchor,
|
|
434
|
+
// so it falls through to the same walk rather than short-circuiting here.
|
|
435
|
+
raw = "";
|
|
436
|
+
}
|
|
437
|
+
return verifyText(logPath, raw, options, null);
|
|
438
|
+
}
|
|
439
|
+
/**
|
|
440
|
+
* {@link verifyWithRecords} over text already in hand, optionally resuming
|
|
441
|
+
* behind a {@link VerifiedPrefix}.
|
|
442
|
+
*
|
|
443
|
+
* With `prefix === null`, `text` is the whole log and the walk starts at
|
|
444
|
+
* genesis: this is exactly what {@link verifyWithRecords} does, and the two
|
|
445
|
+
* share every check, message, and line number as a result. With a `prefix`,
|
|
446
|
+
* `text` is the *remainder* of the file (the bytes from `prefix.byteLength` on)
|
|
447
|
+
* and the walk chains onto `prefix.head` with line numbers offset by
|
|
448
|
+
* `prefix.lines`, so a resumed verdict is textually identical to the cold one.
|
|
449
|
+
*
|
|
450
|
+
* Exported for `core/state.ts`'s verified-read cache and for nothing else. Every
|
|
451
|
+
* schema check, hash recompute, `seq` succession check, and `prev` link check
|
|
452
|
+
* still runs on every record the walk covers; resuming changes only *which*
|
|
453
|
+
* records are covered, never how.
|
|
454
|
+
*/
|
|
455
|
+
export function verifyText(logPath, text, options = {}, prefix = null) {
|
|
456
|
+
// The read boundary, explicitly (APRV-121). A record that was valid when it
|
|
457
|
+
// was appended stays valid forever: the log is append-only, so a verifier
|
|
458
|
+
// that refused the monetary representation of its own history would declare
|
|
459
|
+
// every log written before the change corrupt. The write boundary is
|
|
460
|
+
// unaffected and stays strict — see `ValidationMode` in `core/validate.ts`.
|
|
461
|
+
const validateOptions = options.schemaDir === undefined
|
|
462
|
+
? { mode: "historical" }
|
|
463
|
+
: { schemaDir: options.schemaDir, mode: "historical" };
|
|
464
|
+
const start = prefix === null
|
|
465
|
+
? GENESIS_START
|
|
466
|
+
: { prevSeq: prefix.head.seq, prevHash: prefix.head.hash, lineNumberBase: prefix.lines };
|
|
467
|
+
const priorRecords = prefix === null ? [] : prefix.records;
|
|
468
|
+
const priorLines = prefix === null ? 0 : prefix.lines;
|
|
469
|
+
const { complete, torn } = text.length === 0 ? { complete: [], torn: null } : splitLines(text);
|
|
470
|
+
// Absolute over the whole log, not over this walk: a resumed read behind a
|
|
471
|
+
// verified prefix has already accounted for `priorLines` records, and an
|
|
472
|
+
// operator watching "1500/3000" should not see it restart at zero because
|
|
473
|
+
// the process happened to hold a warm cache (APRV-167).
|
|
474
|
+
const progressTotal = priorLines + complete.length;
|
|
475
|
+
const listener = options.onProgress;
|
|
476
|
+
let reported = -1;
|
|
477
|
+
const report = listener === undefined
|
|
478
|
+
? null
|
|
479
|
+
: (consumed) => {
|
|
480
|
+
// Never twice for the same count, and never backwards: the closing
|
|
481
|
+
// call below lands on a number an interval boundary may already have
|
|
482
|
+
// reported, and a listener drawing a bar should not see it repeat.
|
|
483
|
+
if (consumed <= reported)
|
|
484
|
+
return;
|
|
485
|
+
reported = consumed;
|
|
486
|
+
listener({ done: priorLines + consumed, total: progressTotal });
|
|
487
|
+
};
|
|
488
|
+
const walked = walk(complete, validateOptions, start, report);
|
|
489
|
+
// The closing call: the count the walk actually reached, which is the total
|
|
490
|
+
// when the chain held and the verified prefix when it did not. Reporting the
|
|
491
|
+
// total for a walk that stopped at record 12 would be a progress meter
|
|
492
|
+
// claiming work that was refused.
|
|
493
|
+
if (report !== null) {
|
|
494
|
+
report(walked.failure === null ? complete.length : walked.records.length);
|
|
495
|
+
}
|
|
496
|
+
const { failure, head } = walked;
|
|
497
|
+
const records = priorRecords.length === 0 ? walked.records : [...priorRecords, ...walked.records];
|
|
498
|
+
const lineCount = priorLines + complete.length;
|
|
499
|
+
// A corrupt prefix outranks a torn tail: the tear is the least of the log's
|
|
500
|
+
// problems, and reporting it would understate the damage.
|
|
501
|
+
if (failure !== null)
|
|
502
|
+
return { result: failure, records };
|
|
503
|
+
// Computed once over the records the walk vouched for, and attached to every
|
|
504
|
+
// non-corrupt verdict. Additive: it changes no status, no exit code, and no
|
|
505
|
+
// authorization. Clean with anomalies is clean.
|
|
506
|
+
const anomalies = chainAnomalies(records, toleranceOf(options));
|
|
507
|
+
if (torn !== null) {
|
|
508
|
+
return {
|
|
509
|
+
result: {
|
|
510
|
+
status: "torn-tail",
|
|
511
|
+
anomalies,
|
|
512
|
+
records: lineCount,
|
|
513
|
+
intactThroughSeq: head === null ? 0 : head.seq,
|
|
514
|
+
message: `log ${logPath} ends with an unterminated line of ${torn.length} byte(s); records 1..${head === null ? 0 : head.seq} verify clean. This is the signature of a crashed write. The log is NOT repaired here: truncating the torn line is a human decision.`,
|
|
515
|
+
},
|
|
516
|
+
records,
|
|
517
|
+
};
|
|
518
|
+
}
|
|
519
|
+
const expected = options.expectedHead;
|
|
520
|
+
if (expected !== undefined) {
|
|
521
|
+
if (head === null) {
|
|
522
|
+
return {
|
|
523
|
+
result: corrupt("head-mismatch", null, `log ${logPath} is empty but the anchored head is seq ${expected.seq} ${expected.hash}: records have been removed`),
|
|
524
|
+
records,
|
|
525
|
+
};
|
|
526
|
+
}
|
|
527
|
+
if (head.seq !== expected.seq || head.hash !== expected.hash) {
|
|
528
|
+
return {
|
|
529
|
+
result: corrupt("head-mismatch", head.seq, `log ${logPath} ends at seq ${head.seq} ${head.hash}, but the anchored head is seq ${expected.seq} ${expected.hash}: the log is internally consistent, so this is truncation or a fully recomputed forged suffix`),
|
|
530
|
+
records,
|
|
531
|
+
};
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
return { result: { status: "clean", records: lineCount, head, anomalies }, records };
|
|
535
|
+
}
|
|
536
|
+
/**
|
|
537
|
+
* Verify the hash chain of the log at `logPath`.
|
|
538
|
+
*
|
|
539
|
+
* An absent file is an empty log, which is clean with zero records and a `null`
|
|
540
|
+
* head — an audit trail that has recorded nothing is not evidence of tampering.
|
|
541
|
+
*
|
|
542
|
+
* The file is opened for reading only; see the module header for the recovery
|
|
543
|
+
* stance and the detection boundary. This is {@link verifyWithRecords} with the
|
|
544
|
+
* records dropped — one walk, one implementation.
|
|
545
|
+
*/
|
|
546
|
+
export function verify(logPath, options = {}) {
|
|
547
|
+
return verifyWithRecords(logPath, options).result;
|
|
548
|
+
}
|
|
549
|
+
//# sourceMappingURL=verify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../../src/core/verify.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Version constants for the approval.md runtime.
|
|
3
|
+
*
|
|
4
|
+
* `SPEC_VERSION` tracks the version of SPEC.md this build implements.
|
|
5
|
+
*/
|
|
6
|
+
export declare const SPEC_VERSION = "0.1.0-draft";
|
|
7
|
+
/** Policy schema version accepted in `APPROVAL.md` frontmatter (`version:`). */
|
|
8
|
+
export declare const POLICY_VERSION = "0.1";
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Version constants for the approval.md runtime.
|
|
3
|
+
*
|
|
4
|
+
* `SPEC_VERSION` tracks the version of SPEC.md this build implements.
|
|
5
|
+
*/
|
|
6
|
+
export const SPEC_VERSION = "0.1.0-draft";
|
|
7
|
+
/** Policy schema version accepted in `APPROVAL.md` frontmatter (`version:`). */
|
|
8
|
+
export const POLICY_VERSION = "0.1";
|
|
9
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../../src/core/version.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,aAAa,CAAC;AAE1C,gFAAgF;AAChF,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,CAAC"}
|