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,458 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The attestation ceremony, collected through a channel (APRV-109, amended
|
|
3
|
+
* SPEC.md §10.1/§10.3/§11).
|
|
4
|
+
*
|
|
5
|
+
* ## The problem
|
|
6
|
+
*
|
|
7
|
+
* Attestation is human-only (`core/attest.ts`), and identity is
|
|
8
|
+
* config-declared, so the two policy ceremonies — `policy attest` and `policy
|
|
9
|
+
* amend` — required the human to be at a terminal. Every other decision in this
|
|
10
|
+
* system had already been reduced to a tap on a phone; the one act that decides
|
|
11
|
+
* which rules are in force had not. This module is the missing half: an agent
|
|
12
|
+
* prepares the policy edit and appends a *proposal*, a channel puts it in front
|
|
13
|
+
* of the approver like any other manual prompt, and the tap appends the
|
|
14
|
+
* `policy.updated` attestation under the human identity the listener holds,
|
|
15
|
+
* exactly as a grant lands today.
|
|
16
|
+
*
|
|
17
|
+
* ## What is computed, and why it has to be
|
|
18
|
+
*
|
|
19
|
+
* A proposal carries three things a channel renders: the SHA-256 of the policy
|
|
20
|
+
* file's exact bytes, the semantic diff of what those bytes change about class
|
|
21
|
+
* resolution, and the load advisory. **All three are derived here from the
|
|
22
|
+
* bytes** — none is accepted from the proposing agent. {@link ProposeInput}
|
|
23
|
+
* has no field for a hash, a diff or a verdict, so the refusal of a
|
|
24
|
+
* caller-authored value is structural in the same way the refusal of a
|
|
25
|
+
* caller-supplied `ts` is (amended SPEC.md §8, A2). An agent that could author
|
|
26
|
+
* the diff summary could show an approver one story and attest another file.
|
|
27
|
+
*
|
|
28
|
+
* The BASELINE the diff is taken against is the one place a caller supplies
|
|
29
|
+
* material, and it is checked rather than trusted: bytes whose own SHA-256 is
|
|
30
|
+
* not the latest attested hash are refused as a baseline and the proposal falls
|
|
31
|
+
* to hash-only mode. That is `cli/amend.ts`'s rule ("a baseline nobody can
|
|
32
|
+
* verify is not a baseline"), enforced here so every caller inherits it.
|
|
33
|
+
*
|
|
34
|
+
* ## Fail closed, in this order
|
|
35
|
+
*
|
|
36
|
+
* - A policy file that cannot be read proposes nothing.
|
|
37
|
+
* - A live file that already matches its attestation proposes nothing: there is
|
|
38
|
+
* no amendment to sign, and a prompt for one would ask a human to re-attest
|
|
39
|
+
* bytes already in force.
|
|
40
|
+
* - A rendered diff larger than {@link ATTESTATION_DIFF_MAX_CHARS} REFUSES
|
|
41
|
+
* (`diff-too-large`) rather than truncating. A phone that shows two thirds of
|
|
42
|
+
* a policy change collects a signature for the third it did not show, and the
|
|
43
|
+
* repair — read it at a terminal and run `approval policy amend` there — is a
|
|
44
|
+
* real repair rather than a smaller lie.
|
|
45
|
+
* - A tap whose proposal's bytes are no longer the bytes on disk refuses
|
|
46
|
+
* `proposal-stale` and attests nothing. The hash the human was shown is the
|
|
47
|
+
* hash that gets attested, or nothing does.
|
|
48
|
+
* - A decline, a supersession and a lapsed deadline all attest nothing. Only
|
|
49
|
+
* {@link decideAttestation}`(…, "attest", …)` ever appends a `policy.updated`.
|
|
50
|
+
*
|
|
51
|
+
* Everything that writes here goes through `core/log.ts`'s `appendEvent` with a
|
|
52
|
+
* compare-and-append precondition and a runtime-assigned timestamp, so the new
|
|
53
|
+
* records inherit the same write-boundary discipline as the rest of the gate.
|
|
54
|
+
*/
|
|
55
|
+
import { readFileSync } from "node:fs";
|
|
56
|
+
import { basename, join } from "node:path";
|
|
57
|
+
import { POLICY_HASH_FIELD, checkAttestationOfBytes, policyBytesHash, } from "./attest.js";
|
|
58
|
+
import { tick } from "./clock.js";
|
|
59
|
+
import { appendEvent, } from "./log.js";
|
|
60
|
+
import { payloadHash } from "./payload.js";
|
|
61
|
+
import { payloadStoreDirFor, storePayload } from "./payload-store.js";
|
|
62
|
+
import { diffPolicies, renderDiff, SPEC_NAMESPACES } from "./policy-diff.js";
|
|
63
|
+
import { loadPolicyText, POLICY_FILENAMES } from "./policy-load.js";
|
|
64
|
+
import { readVerifiedRecords } from "./state.js";
|
|
65
|
+
/** Actors permitted to propose: a person or an agent, never the runtime. */
|
|
66
|
+
const PRINCIPAL_ACTOR = /^(human|agent):.+/u;
|
|
67
|
+
/** Actors permitted to answer a proposal. Human-only, in code (SPEC.md §11). */
|
|
68
|
+
const HUMAN_ACTOR = /^human:.+/u;
|
|
69
|
+
/**
|
|
70
|
+
* The event an agent appends to ask for an attestation.
|
|
71
|
+
*
|
|
72
|
+
* Named `proposed` rather than `requested` deliberately: `approval.requested`
|
|
73
|
+
* is the approval lifecycle, with its own TTL, its own budgets and its own
|
|
74
|
+
* grant. This is a different question with a different answer event, and giving
|
|
75
|
+
* it the same word would invite a reader — or a projection — to treat a policy
|
|
76
|
+
* attestation as an ordinary authorization.
|
|
77
|
+
*/
|
|
78
|
+
export const PROPOSAL_EVENT = "policy.proposed";
|
|
79
|
+
/** The event a decline appends. An attestation appends `policy.updated`. */
|
|
80
|
+
export const DECLINE_EVENT = "policy.declined";
|
|
81
|
+
/**
|
|
82
|
+
* The idempotency key an attestation prompt is rendered under.
|
|
83
|
+
*
|
|
84
|
+
* `policy.attest:<sha256>` — derived from the proposed bytes and from nothing
|
|
85
|
+
* else, so two proposals of the same policy text carry the same key and a tap
|
|
86
|
+
* on either answers the same question. It is also what
|
|
87
|
+
* `channels/contract.ts` routes on: a gesture whose key starts with this prefix
|
|
88
|
+
* becomes an attestation, never a grant.
|
|
89
|
+
*/
|
|
90
|
+
export const ATTESTATION_KEY_PREFIX = "policy.attest:";
|
|
91
|
+
/** The action class an attestation prompt is resolved and rendered under. */
|
|
92
|
+
export const ATTESTATION_CLASS = "policy.edit";
|
|
93
|
+
/** `policy.attest:<sha256>` for the given policy bytes. */
|
|
94
|
+
export function attestationActionKey(sha256) {
|
|
95
|
+
return `${ATTESTATION_KEY_PREFIX}${sha256}`;
|
|
96
|
+
}
|
|
97
|
+
/** Is this an attestation prompt's key rather than an ordinary action's? */
|
|
98
|
+
export function isAttestationActionKey(actionKey) {
|
|
99
|
+
return actionKey.startsWith(ATTESTATION_KEY_PREFIX);
|
|
100
|
+
}
|
|
101
|
+
/** The proposed policy hash named by an attestation key, or `null`. */
|
|
102
|
+
export function attestationKeySha256(actionKey) {
|
|
103
|
+
if (!isAttestationActionKey(actionKey))
|
|
104
|
+
return null;
|
|
105
|
+
const hash = actionKey.slice(ATTESTATION_KEY_PREFIX.length);
|
|
106
|
+
return /^[a-f0-9]{64}$/u.test(hash) ? hash : null;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* The largest rendered diff a channel prompt may carry, in characters.
|
|
110
|
+
*
|
|
111
|
+
* Telegram's hard limit is 4096 characters for one message and the prompt
|
|
112
|
+
* carries a dozen other lines besides the diff, so this is the budget the
|
|
113
|
+
* *smallest* supported channel can show whole. It is a refusal threshold and
|
|
114
|
+
* never a truncation point: see the module header.
|
|
115
|
+
*/
|
|
116
|
+
export const ATTESTATION_DIFF_MAX_CHARS = 2400;
|
|
117
|
+
/** The same bound, in lines: a diff nobody will scroll is a diff nobody reads. */
|
|
118
|
+
export const ATTESTATION_DIFF_MAX_LINES = 60;
|
|
119
|
+
function refuse(code, message, extra = {}) {
|
|
120
|
+
return { ok: false, code, message, ...extra };
|
|
121
|
+
}
|
|
122
|
+
function detail(cause) {
|
|
123
|
+
return cause instanceof Error ? cause.message : String(cause);
|
|
124
|
+
}
|
|
125
|
+
function appendOptionsOf(options) {
|
|
126
|
+
const append = { ...options.append };
|
|
127
|
+
if (options.schemaDir !== undefined)
|
|
128
|
+
append.schemaDir = options.schemaDir;
|
|
129
|
+
return append;
|
|
130
|
+
}
|
|
131
|
+
function append(logPath, input, options, expectedHead) {
|
|
132
|
+
const result = appendEvent(logPath, input, {
|
|
133
|
+
...appendOptionsOf(options),
|
|
134
|
+
expectedHead,
|
|
135
|
+
});
|
|
136
|
+
if (result.ok)
|
|
137
|
+
return { ok: true, record: result.record };
|
|
138
|
+
return refuse("append-failed", `${input.event} could not be appended: ${result.error.message}`, {
|
|
139
|
+
append: result.error,
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* The policy file a proposal concerns, discovered the way `loadPolicy` does so
|
|
144
|
+
* the proposed file and the enforced file are never two different files.
|
|
145
|
+
*/
|
|
146
|
+
export function proposalPolicyPath(dir) {
|
|
147
|
+
for (const filename of POLICY_FILENAMES) {
|
|
148
|
+
const candidate = join(dir, filename);
|
|
149
|
+
try {
|
|
150
|
+
readFileSync(candidate);
|
|
151
|
+
return candidate;
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return join(dir, POLICY_FILENAMES[0] ?? "APPROVAL.md");
|
|
158
|
+
}
|
|
159
|
+
/** The load advisory for policy text, as a channel renders it. */
|
|
160
|
+
export function adviseLoad(policyPath, text, schemaDir) {
|
|
161
|
+
const load = loadPolicyText(policyPath, text, schemaDir === undefined ? {} : { schemaDir });
|
|
162
|
+
return load.ok
|
|
163
|
+
? { ok: true, code: null, message: null }
|
|
164
|
+
: { ok: false, code: load.code, message: load.message };
|
|
165
|
+
}
|
|
166
|
+
/** The one-line headline of a diff: what changed, counted by section. */
|
|
167
|
+
function headlineOf(diff) {
|
|
168
|
+
const parts = [];
|
|
169
|
+
if (diff.classes.length > 0)
|
|
170
|
+
parts.push(`${String(diff.classes.length)} class resolution(s)`);
|
|
171
|
+
if (diff.approvers.length > 0)
|
|
172
|
+
parts.push(`${String(diff.approvers.length)} approver change(s)`);
|
|
173
|
+
if (diff.defaults.length > 0)
|
|
174
|
+
parts.push(`${String(diff.defaults.length)} default(s)`);
|
|
175
|
+
if (diff.budgets.length > 0)
|
|
176
|
+
parts.push(`${String(diff.budgets.length)} limit(s)`);
|
|
177
|
+
if (diff.vocabulary.length > 0)
|
|
178
|
+
parts.push(`${String(diff.vocabulary.length)} policy key(s)`);
|
|
179
|
+
return parts.length === 0 ? "no semantic change" : parts.join(", ");
|
|
180
|
+
}
|
|
181
|
+
/** The rendered size of a diff summary, as the channel budget counts it. */
|
|
182
|
+
export function diffSize(summary) {
|
|
183
|
+
return {
|
|
184
|
+
chars: summary.lines.reduce((total, line) => total + line.length + 1, 0),
|
|
185
|
+
lines: summary.lines.length,
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* The semantic diff between the attested baseline and the proposed bytes.
|
|
190
|
+
*
|
|
191
|
+
* Hash-only mode (`available: false`) whenever the baseline cannot be *proved*
|
|
192
|
+
* to be the attested text: no baseline was offered, none was ever attested, or
|
|
193
|
+
* the offered bytes hash to something other than the attestation. The reason is
|
|
194
|
+
* recorded so a channel can print it instead of a diff, which is the honest
|
|
195
|
+
* rendering of "we cannot show you what this changes".
|
|
196
|
+
*/
|
|
197
|
+
export function summarizeDiff(policyPath, baseline, live, attestedSha256, schemaDir) {
|
|
198
|
+
const unavailable = (reason) => ({
|
|
199
|
+
available: false,
|
|
200
|
+
reason,
|
|
201
|
+
lines: [],
|
|
202
|
+
headline: "semantic diff unavailable",
|
|
203
|
+
baseline_sha256: null,
|
|
204
|
+
});
|
|
205
|
+
if (attestedSha256 === null) {
|
|
206
|
+
return unavailable("the policy has never been attested, so there is no previous state to diff against");
|
|
207
|
+
}
|
|
208
|
+
if (baseline === null || baseline === undefined) {
|
|
209
|
+
return unavailable("no baseline text was supplied, and the attested BYTES are not recoverable from the log (an attestation records only their SHA-256)");
|
|
210
|
+
}
|
|
211
|
+
const baselineSha256 = policyBytesHash(baseline);
|
|
212
|
+
if (baselineSha256 !== attestedSha256) {
|
|
213
|
+
return unavailable(`the supplied baseline hashes ${baselineSha256}, which is not the attested ${attestedSha256}; a baseline nobody can verify is not a baseline`);
|
|
214
|
+
}
|
|
215
|
+
const options = schemaDir === undefined ? {} : { schemaDir };
|
|
216
|
+
const before = loadPolicyText(policyPath, Buffer.from(baseline).toString("utf8"), options);
|
|
217
|
+
const after = loadPolicyText(policyPath, Buffer.from(live).toString("utf8"), options);
|
|
218
|
+
const diff = diffPolicies(before, after, SPEC_NAMESPACES);
|
|
219
|
+
return {
|
|
220
|
+
available: true,
|
|
221
|
+
reason: null,
|
|
222
|
+
lines: renderDiff(diff),
|
|
223
|
+
headline: headlineOf(diff),
|
|
224
|
+
baseline_sha256: baselineSha256,
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
/** The stored value a channel displays as the prompt's full payload. */
|
|
228
|
+
export function proposalPayloadValue(policyPath, text) {
|
|
229
|
+
return { policy_path: basename(policyPath), text };
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Append a `policy.proposed` asking a human to attest `policyPath`'s bytes.
|
|
233
|
+
*
|
|
234
|
+
* The record's payload is the prompt: `sha256`, `diff` and `load` are all
|
|
235
|
+
* derived here, `note` and `wait_until` are the proposer's and are labelled
|
|
236
|
+
* claimed by every channel. `payload_hash` binds the full policy text stored
|
|
237
|
+
* beside the log, so the approver can read the whole file rather than only the
|
|
238
|
+
* summary (SPEC.md §10.4).
|
|
239
|
+
*
|
|
240
|
+
* No attestation is required to append one. That is the point of the verb: the
|
|
241
|
+
* live policy is mid-amendment and therefore unattested, which is exactly the
|
|
242
|
+
* state in which every other gate operation refuses. This one asks a human to
|
|
243
|
+
* end that state.
|
|
244
|
+
*/
|
|
245
|
+
export function proposeAttestation(logPath, input, actor, options = {}) {
|
|
246
|
+
const ts = tick(options);
|
|
247
|
+
if (!PRINCIPAL_ACTOR.test(actor)) {
|
|
248
|
+
return refuse("actor-invalid", `a policy proposal requires a human: or agent: actor, got ${JSON.stringify(actor)}`);
|
|
249
|
+
}
|
|
250
|
+
const read = readVerifiedRecords(logPath, options.schemaDir === undefined ? {} : { schemaDir: options.schemaDir });
|
|
251
|
+
if (!read.ok)
|
|
252
|
+
return refuse(read.code, read.message);
|
|
253
|
+
let bytes;
|
|
254
|
+
try {
|
|
255
|
+
bytes = readFileSync(input.policyPath);
|
|
256
|
+
}
|
|
257
|
+
catch (cause) {
|
|
258
|
+
return refuse("policy-not-attested", `policy ${input.policyPath} could not be read: ${detail(cause)}; an unverifiable policy is treated as unattested and nothing was proposed`, { detail: "unreadable" });
|
|
259
|
+
}
|
|
260
|
+
const status = checkAttestationOfBytes(read.records, bytes);
|
|
261
|
+
if (status.status === "attested") {
|
|
262
|
+
return refuse("policy-already-attested", `${input.policyPath} already matches its attestation at seq ${String(status.seq)}; there is no amendment to sign, and a prompt for one would ask a human to re-attest bytes that are already in force`);
|
|
263
|
+
}
|
|
264
|
+
const sha256 = policyBytesHash(bytes);
|
|
265
|
+
const attestedSha256 = status.status === "hash-mismatch" ? status.attestedSha256 : null;
|
|
266
|
+
const diff = summarizeDiff(input.policyPath, input.baseline, bytes, attestedSha256, options.schemaDir);
|
|
267
|
+
const size = diffSize(diff);
|
|
268
|
+
if (size.chars > ATTESTATION_DIFF_MAX_CHARS || size.lines > ATTESTATION_DIFF_MAX_LINES) {
|
|
269
|
+
return refuse("diff-too-large", `the semantic diff of ${input.policyPath} renders as ${String(size.lines)} line(s) / ${String(size.chars)} characters, past the ${String(ATTESTATION_DIFF_MAX_LINES)}-line / ${String(ATTESTATION_DIFF_MAX_CHARS)}-character budget a channel prompt can show whole. It is refused rather than truncated: a prompt that shows two thirds of a policy change collects a signature for the third it did not show. Read the diff at a terminal and attest there — \`approval policy amend --as human:<id> --require-load --commit\` — or split the amendment into changes a phone can hold. Nothing was appended.`);
|
|
270
|
+
}
|
|
271
|
+
const text = Buffer.from(bytes).toString("utf8");
|
|
272
|
+
const advisory = adviseLoad(input.policyPath, text, options.schemaDir);
|
|
273
|
+
const value = proposalPayloadValue(input.policyPath, text);
|
|
274
|
+
let boundHash;
|
|
275
|
+
try {
|
|
276
|
+
boundHash = payloadHash(value);
|
|
277
|
+
}
|
|
278
|
+
catch (cause) {
|
|
279
|
+
return refuse("payload-store-failed", `the policy text of ${input.policyPath} could not be canonicalized for display: ${detail(cause)}. Nothing was appended: a prompt whose bytes no channel can display is a prompt no human can answer (SPEC.md §10.4).`);
|
|
280
|
+
}
|
|
281
|
+
const stored = storePayload(options.payloadStoreDir ?? payloadStoreDirFor(logPath), value);
|
|
282
|
+
if (!stored.ok) {
|
|
283
|
+
return refuse("payload-store-failed", `${stored.message} Nothing was appended: an attestation prompt whose policy text no channel can display is a prompt no human can answer (SPEC.md §10.4).`);
|
|
284
|
+
}
|
|
285
|
+
const payload = {
|
|
286
|
+
policy_path: basename(input.policyPath),
|
|
287
|
+
// COMPUTED, every one of them. `ProposeInput` carries no field for any of
|
|
288
|
+
// these, so an agent cannot name the hash it wants attested, describe a
|
|
289
|
+
// change it is not making, or claim its policy loads.
|
|
290
|
+
sha256,
|
|
291
|
+
action_key: attestationActionKey(sha256),
|
|
292
|
+
class: ATTESTATION_CLASS,
|
|
293
|
+
payload_hash: boundHash,
|
|
294
|
+
diff,
|
|
295
|
+
load: advisory,
|
|
296
|
+
};
|
|
297
|
+
if (attestedSha256 !== null)
|
|
298
|
+
payload[POLICY_HASH_FIELD] = attestedSha256;
|
|
299
|
+
if (input.note !== undefined)
|
|
300
|
+
payload["note"] = input.note;
|
|
301
|
+
if (input.waitUntil !== undefined)
|
|
302
|
+
payload["wait_until"] = input.waitUntil;
|
|
303
|
+
const appended = append(logPath, {
|
|
304
|
+
ts,
|
|
305
|
+
event: PROPOSAL_EVENT,
|
|
306
|
+
actor,
|
|
307
|
+
action_key: attestationActionKey(sha256),
|
|
308
|
+
payload,
|
|
309
|
+
}, options, read.head);
|
|
310
|
+
if (!appended.ok)
|
|
311
|
+
return appended;
|
|
312
|
+
return { ok: true, record: appended.record, sha256, diff, load: advisory };
|
|
313
|
+
}
|
|
314
|
+
function payloadOf(record) {
|
|
315
|
+
const payload = record.payload;
|
|
316
|
+
return typeof payload === "object" && payload !== null ? payload : {};
|
|
317
|
+
}
|
|
318
|
+
function stringField(record, name) {
|
|
319
|
+
const value = payloadOf(record)[name];
|
|
320
|
+
return typeof value === "string" && value.length > 0 ? value : null;
|
|
321
|
+
}
|
|
322
|
+
/** Every `policy.proposed` record in the log, in append order. */
|
|
323
|
+
export function proposalRecords(records) {
|
|
324
|
+
return records.filter((record) => record.event === PROPOSAL_EVENT);
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Derive one proposal's state at `now`.
|
|
328
|
+
*
|
|
329
|
+
* Terminal states are read off the log; `expired` is arithmetic on the
|
|
330
|
+
* proposer's own `wait_until` and materialises no event, because a lapsed
|
|
331
|
+
* attestation prompt has nothing to record: nothing was attested, and the
|
|
332
|
+
* proposal record already says everything a reader needs. That is the
|
|
333
|
+
* fail-closed reading — a prompt nobody answered leaves the policy exactly as
|
|
334
|
+
* unattested as it was.
|
|
335
|
+
*/
|
|
336
|
+
export function proposalState(records, seq, now) {
|
|
337
|
+
const record = records.find((entry) => entry.seq === seq && entry.event === PROPOSAL_EVENT);
|
|
338
|
+
if (record === undefined)
|
|
339
|
+
return null;
|
|
340
|
+
const sha256 = stringField(record, "sha256");
|
|
341
|
+
if (sha256 === null)
|
|
342
|
+
return null;
|
|
343
|
+
const actionKey = record.action_key ?? attestationActionKey(sha256);
|
|
344
|
+
const path = stringField(record, "policy_path");
|
|
345
|
+
let state = "open";
|
|
346
|
+
for (const entry of records) {
|
|
347
|
+
if (entry.seq <= record.seq)
|
|
348
|
+
continue;
|
|
349
|
+
if (entry.event === "policy.updated" && stringField(entry, "sha256") === sha256) {
|
|
350
|
+
state = "attested";
|
|
351
|
+
break;
|
|
352
|
+
}
|
|
353
|
+
if (entry.event === DECLINE_EVENT && stringField(entry, "sha256") === sha256) {
|
|
354
|
+
state = "declined";
|
|
355
|
+
break;
|
|
356
|
+
}
|
|
357
|
+
if (entry.event === PROPOSAL_EVENT &&
|
|
358
|
+
stringField(entry, "sha256") !== sha256 &&
|
|
359
|
+
stringField(entry, "policy_path") === path) {
|
|
360
|
+
state = "superseded";
|
|
361
|
+
break;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
if (state === "open") {
|
|
365
|
+
const waitUntil = stringField(record, "wait_until");
|
|
366
|
+
const deadline = waitUntil === null ? Number.NaN : Date.parse(waitUntil);
|
|
367
|
+
const nowMs = Date.parse(now);
|
|
368
|
+
if (!Number.isNaN(deadline) && !Number.isNaN(nowMs) && nowMs >= deadline)
|
|
369
|
+
state = "expired";
|
|
370
|
+
}
|
|
371
|
+
return { seq: record.seq, actionKey, sha256, state, record };
|
|
372
|
+
}
|
|
373
|
+
/** Every proposal still awaiting a human answer at `now`, in log order. */
|
|
374
|
+
export function openProposals(records, now) {
|
|
375
|
+
const open = [];
|
|
376
|
+
for (const record of proposalRecords(records)) {
|
|
377
|
+
const derived = proposalState(records, record.seq, now);
|
|
378
|
+
if (derived !== null && derived.state === "open")
|
|
379
|
+
open.push(derived);
|
|
380
|
+
}
|
|
381
|
+
return open;
|
|
382
|
+
}
|
|
383
|
+
/** The open proposal whose bytes hash to `sha256`, or `null`. */
|
|
384
|
+
export function openProposalFor(records, sha256, now) {
|
|
385
|
+
const matches = openProposals(records, now).filter((entry) => entry.sha256 === sha256);
|
|
386
|
+
return matches[matches.length - 1] ?? null;
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Answer a proposal: attest the bytes the prompt displayed, or decline them.
|
|
390
|
+
*
|
|
391
|
+
* Human-only, in code — the same rule `core/attest.ts` enforces, restated here
|
|
392
|
+
* because this is a second door onto the same act and the rule must hold for
|
|
393
|
+
* every caller and not only for the CLI's.
|
|
394
|
+
*
|
|
395
|
+
* **The attested hash is the hash the prompt displayed.** Before anything is
|
|
396
|
+
* appended the live file is re-read and re-hashed, and any difference refuses
|
|
397
|
+
* `proposal-stale`: the human signed for bytes they were shown, and bytes that
|
|
398
|
+
* changed underneath the prompt are a different policy that has to be proposed
|
|
399
|
+
* again. This is the one check that makes "the phone shows the diff and the
|
|
400
|
+
* hash" mean anything.
|
|
401
|
+
*
|
|
402
|
+
* A decline appends `policy.declined` and attests nothing. So does a lapsed
|
|
403
|
+
* deadline, by appending nothing at all.
|
|
404
|
+
*/
|
|
405
|
+
export function decideAttestation(logPath, seq, decision, actor, options = {}) {
|
|
406
|
+
const ts = tick(options);
|
|
407
|
+
if (!HUMAN_ACTOR.test(actor)) {
|
|
408
|
+
return refuse("actor-not-human", `${decision} is a human-only verb; attestation is the one act an agent must not perform, and the actor must match human:<id>, got ${JSON.stringify(actor)}`);
|
|
409
|
+
}
|
|
410
|
+
const read = readVerifiedRecords(logPath, options.schemaDir === undefined ? {} : { schemaDir: options.schemaDir });
|
|
411
|
+
if (!read.ok)
|
|
412
|
+
return refuse(read.code, read.message);
|
|
413
|
+
const derived = proposalState(read.records, seq, ts);
|
|
414
|
+
if (derived === null) {
|
|
415
|
+
return refuse("proposal-not-found", `seq ${String(seq)} is not a ${PROPOSAL_EVENT} record carrying a policy hash; there is no attestation prompt to answer`);
|
|
416
|
+
}
|
|
417
|
+
if (derived.state === "expired") {
|
|
418
|
+
return refuse("expired", `the attestation prompt at seq ${String(seq)} passed the deadline its proposer declared; nothing was attested. Propose the amendment again — a prompt nobody answered leaves the policy exactly as unattested as it was.`);
|
|
419
|
+
}
|
|
420
|
+
if (derived.state !== "open") {
|
|
421
|
+
return refuse("already-decided", `the attestation prompt at seq ${String(seq)} is ${derived.state}; a second answer would rewrite a human's decision about which policy bytes are in force`);
|
|
422
|
+
}
|
|
423
|
+
const policyPath = options.policyPath ?? stringField(derived.record, "policy_path") ?? "APPROVAL.md";
|
|
424
|
+
if (decision === "attest") {
|
|
425
|
+
let bytes;
|
|
426
|
+
try {
|
|
427
|
+
bytes = readFileSync(policyPath);
|
|
428
|
+
}
|
|
429
|
+
catch (cause) {
|
|
430
|
+
return refuse("proposal-stale", `the policy file ${policyPath} could not be read to confirm the bytes this prompt displayed: ${detail(cause)}. Nothing was attested: an attestation names bytes, and bytes nobody can read are not the bytes anybody was shown.`);
|
|
431
|
+
}
|
|
432
|
+
const live = policyBytesHash(bytes);
|
|
433
|
+
if (live !== derived.sha256) {
|
|
434
|
+
return refuse("proposal-stale", `the attestation prompt at seq ${String(seq)} displayed ${derived.sha256} and ${policyPath} now hashes ${live}; the file changed after the question was asked, so a tap here would attest bytes the approver was never shown. Nothing was attested: propose the amendment again, which re-renders the diff and the advisory over the bytes actually on disk.`);
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
const payload = {
|
|
438
|
+
policy_path: basename(policyPath),
|
|
439
|
+
sha256: derived.sha256,
|
|
440
|
+
proposed_seq: derived.seq,
|
|
441
|
+
};
|
|
442
|
+
if (options.note !== undefined)
|
|
443
|
+
payload["note"] = options.note;
|
|
444
|
+
if (options.batchDeliveryId !== undefined && options.batchDeliveryId.length > 0) {
|
|
445
|
+
payload["batch_delivery_id"] = options.batchDeliveryId;
|
|
446
|
+
}
|
|
447
|
+
const appended = append(logPath, {
|
|
448
|
+
ts,
|
|
449
|
+
event: decision === "attest" ? "policy.updated" : DECLINE_EVENT,
|
|
450
|
+
actor,
|
|
451
|
+
action_key: derived.actionKey,
|
|
452
|
+
payload,
|
|
453
|
+
}, options, read.head);
|
|
454
|
+
if (!appended.ok)
|
|
455
|
+
return appended;
|
|
456
|
+
return { ok: true, decision, record: appended.record, sha256: derived.sha256 };
|
|
457
|
+
}
|
|
458
|
+
//# sourceMappingURL=policy-proposal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy-proposal.js","sourceRoot":"","sources":["../../../src/core/policy-proposal.ts"],"names":[],"mappings":"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"}
|