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,588 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Semantic policy diff (APRV-30) — what an edit to `APPROVAL.md` actually
|
|
3
|
+
* *changes about the runtime's answers*, computed by the real engine on both
|
|
4
|
+
* versions of the file.
|
|
5
|
+
*
|
|
6
|
+
* ## Why this module exists: two live incidents
|
|
7
|
+
*
|
|
8
|
+
* **seq 2 of this repository's own log.** An amendment was attested and then
|
|
9
|
+
* superseded eleven minutes later, because the operator attested a policy edit
|
|
10
|
+
* that broke a pinned dogfood assertion — a fact nobody learned until the test
|
|
11
|
+
* suite ran, well after the bytes had been signed for. Nothing in the ceremony
|
|
12
|
+
* had asked "what does this edit change?" before recording "a human saw these
|
|
13
|
+
* bytes".
|
|
14
|
+
*
|
|
15
|
+
* **The unsigned interregnum.** Commit `f829e6c` edited the policy file; its
|
|
16
|
+
* attestation landed in a later commit. In between, the repository was carrying
|
|
17
|
+
* an *inoperative* policy: `checkAttestation` reported `hash-mismatch`, and
|
|
18
|
+
* every gate operation refused. The edit and the attestation were two acts when
|
|
19
|
+
* they should have been one.
|
|
20
|
+
*
|
|
21
|
+
* Both incidents share a shape: the policy edit was treated as a text change
|
|
22
|
+
* rather than as an amendment with consequences. This module supplies the
|
|
23
|
+
* missing half of the ceremony — the consequences — and `cli/amend.ts` supplies
|
|
24
|
+
* the ceremony itself.
|
|
25
|
+
*
|
|
26
|
+
* ## What is compared, and how
|
|
27
|
+
*
|
|
28
|
+
* Nothing here re-implements matching, specificity, the irreversibility floor,
|
|
29
|
+
* or defaulting. {@link diffPolicies} calls `resolve()` from
|
|
30
|
+
* `core/policy-match.ts` on **both** loads for the same probe class, and reports
|
|
31
|
+
* the pairs that differ. A diff that computed the answer a second way could
|
|
32
|
+
* disagree with the engine, and the diff would be the more convincing lie.
|
|
33
|
+
*
|
|
34
|
+
* Five sections:
|
|
35
|
+
*
|
|
36
|
+
* - **classes** — resolution changes (autonomy, provenance, matched pattern)
|
|
37
|
+
* over a probe set: every key of either version's `classes` map, plus the
|
|
38
|
+
* caller's `sampleClasses` (the CLI passes SPEC.md §7's top-level namespaces).
|
|
39
|
+
* - **approvers** — approvers added, removed, or whose channel reachability
|
|
40
|
+
* changed, plus the class rules left naming an approver the policy no longer
|
|
41
|
+
* defines. Losing the only human who can be reached for a class is an
|
|
42
|
+
* availability change disguised as a config tweak.
|
|
43
|
+
* - **defaults** — `autonomy`, `channel`, `approval_ttl`, `on_expiry`.
|
|
44
|
+
* - **budgets** — every `(scope, limit)` pair, old -> new. Scopes are the
|
|
45
|
+
* `budgets` map's keys plus `classes.<pattern>` for a rule's `limits`.
|
|
46
|
+
* - **vocabulary** — every other key of the policy document, by dotted path,
|
|
47
|
+
* before -> after. See below.
|
|
48
|
+
*
|
|
49
|
+
* ## The vocabulary section, and the incident that added it (APRV-111)
|
|
50
|
+
*
|
|
51
|
+
* On 2026-08-20 a real amendment added `protected_paths: [SPEC.md]` — a key
|
|
52
|
+
* that decides which file edits are `policy.edit`, which is to say which edits
|
|
53
|
+
* a human has to approve — and this module reported **"no semantic change"**.
|
|
54
|
+
* The four sections above were the whole diff, and none of them can see a
|
|
55
|
+
* top-level key outside `classes` / `approvers` / `defaults` / `budgets`. A
|
|
56
|
+
* human was shown "nothing changed" while signing bytes that moved the gate.
|
|
57
|
+
*
|
|
58
|
+
* The fix is not a fifth hand-written list, because a hand-written list is
|
|
59
|
+
* exactly what went stale: `protected_paths` was added to the vocabulary by
|
|
60
|
+
* APRV-107 and nothing here changed. {@link diffPolicies} now walks **both
|
|
61
|
+
* documents' actual keys**, flattens them to dotted paths, and reports every
|
|
62
|
+
* pair that differs. New spec keys are covered the day they parse, with no edit
|
|
63
|
+
* to this file. Paths the dedicated sections already report are dropped, so
|
|
64
|
+
* nothing is said twice.
|
|
65
|
+
*
|
|
66
|
+
* Two consequences worth stating:
|
|
67
|
+
*
|
|
68
|
+
* - **Unknown top-level keys are named, never dropped.** `policy.schema.json`
|
|
69
|
+
* is closed, so an unrecognised key means the load FAILED and the policy is
|
|
70
|
+
* all-manual. That key is reported (marked `recognised: false`) whether or
|
|
71
|
+
* not its value changed: the display side fails closed too, and an edit this
|
|
72
|
+
* module cannot describe must be called out rather than summarised as no
|
|
73
|
+
* change. Which keys are known is READ FROM THAT SCHEMA since APRV-296 (see
|
|
74
|
+
* {@link policyTopLevelKeys}), because the hand-written copy that stood here
|
|
75
|
+
* fell behind it and warned an operator about three `daemon.*` keys the
|
|
76
|
+
* schema had admitted for a month.
|
|
77
|
+
* - **A side whose YAML never parsed has no vocabulary to read.** Then
|
|
78
|
+
* {@link PolicyDiff.vocabularyComparable} is `false` and the renderer says the
|
|
79
|
+
* rest of the document was not compared, instead of printing "no semantic
|
|
80
|
+
* change" over an unexamined document.
|
|
81
|
+
*
|
|
82
|
+
* ## Probes are a report, not a proof
|
|
83
|
+
*
|
|
84
|
+
* The class space is infinite; a diff over it cannot be exhaustive. The probe
|
|
85
|
+
* set is stated in the output ({@link PolicyDiff.probes}) precisely so a reader
|
|
86
|
+
* knows what was *not* examined. Wildcard keys (`read.*`) are probed as the
|
|
87
|
+
* literal strings they are, which is the honest thing to do without inventing
|
|
88
|
+
* action classes that nobody declared: both versions are asked the same
|
|
89
|
+
* question, so a difference in the answers is a real difference, and a class
|
|
90
|
+
* outside the probe set may still have changed.
|
|
91
|
+
*
|
|
92
|
+
* ## Fail-closed sides are rendered honestly
|
|
93
|
+
*
|
|
94
|
+
* A side that fails to load is not "an empty policy". It resolves **every**
|
|
95
|
+
* class to `manual` with provenance `fail-closed`, and `resolve()` already says
|
|
96
|
+
* so, so the class section stays truthful with no special case. The structural
|
|
97
|
+
* sections are different: a failed load has no `approvers`, `defaults` or
|
|
98
|
+
* `budgets` to read, and reporting them as removed would assert a change the
|
|
99
|
+
* file never made. So when either side failed, those three sections are empty
|
|
100
|
+
* and {@link PolicyDiff.structuralComparable} is `false`, with
|
|
101
|
+
* {@link PolicyDiff.beforeFailure} / {@link PolicyDiff.afterFailure} carrying
|
|
102
|
+
* the codes a renderer prints as "everything manual (fail-closed: <code>)".
|
|
103
|
+
*
|
|
104
|
+
* Deterministic: no clock, no randomness, and probe order is sorted, so the
|
|
105
|
+
* same two loads always produce a byte-identical diff. The one read of the
|
|
106
|
+
* filesystem is the policy SCHEMA, once per process, for the key vocabulary
|
|
107
|
+
* described above; nothing here reads a policy file, and no answer depends on
|
|
108
|
+
* anything but the two loads it was handed.
|
|
109
|
+
*/
|
|
110
|
+
import { readFileSync } from "node:fs";
|
|
111
|
+
import { fileURLToPath } from "node:url";
|
|
112
|
+
import { resolve } from "./policy-match.js";
|
|
113
|
+
/**
|
|
114
|
+
* SPEC.md §7's reserved top-level namespaces, in table order.
|
|
115
|
+
*
|
|
116
|
+
* Exported here rather than in the CLI because they are a fact about the spec's
|
|
117
|
+
* taxonomy, not about a command's flags, and because a diff that only probed
|
|
118
|
+
* the classes a policy happens to name would go quiet on exactly the edit that
|
|
119
|
+
* matters most: one that *stops* naming a dangerous namespace and lets it fall
|
|
120
|
+
* through to `defaults.autonomy`.
|
|
121
|
+
*/
|
|
122
|
+
export const SPEC_NAMESPACES = [
|
|
123
|
+
"read.*",
|
|
124
|
+
"files.write.*",
|
|
125
|
+
"communicate.*",
|
|
126
|
+
"calendar.write.*",
|
|
127
|
+
"financial.*",
|
|
128
|
+
"public.*",
|
|
129
|
+
"data.delete",
|
|
130
|
+
"account.*",
|
|
131
|
+
"physical.*",
|
|
132
|
+
"record.*",
|
|
133
|
+
];
|
|
134
|
+
const DEFAULT_FIELDS = [
|
|
135
|
+
"autonomy",
|
|
136
|
+
"channel",
|
|
137
|
+
"approval_ttl",
|
|
138
|
+
"on_expiry",
|
|
139
|
+
];
|
|
140
|
+
/**
|
|
141
|
+
* The policy schema on disk, the file `core/validate.ts` validates against.
|
|
142
|
+
*
|
|
143
|
+
* Derived here rather than imported from `DEFAULT_SCHEMA_DIR` so this module
|
|
144
|
+
* keeps its empty runtime dependency graph: importing `validate.ts` would pull
|
|
145
|
+
* Ajv into every process that renders a diff, the Telegram channel included.
|
|
146
|
+
* The two derivations are the same walk from the same directory, and
|
|
147
|
+
* `tests/policy-vocabulary.test.ts` asserts they name one file, so a schema
|
|
148
|
+
* directory that ever moves fails there rather than drifting quietly.
|
|
149
|
+
*/
|
|
150
|
+
export const POLICY_SCHEMA_PATH = fileURLToPath(new URL("../../../schema/policy.schema.json", import.meta.url));
|
|
151
|
+
/**
|
|
152
|
+
* The vocabulary as it stood when it was written by hand, kept as the FALLBACK
|
|
153
|
+
* for a schema that cannot be read or parsed.
|
|
154
|
+
*
|
|
155
|
+
* It is deliberately the stale list rather than an empty one or a wildcard: an
|
|
156
|
+
* unreadable schema must leave the renderer erring loud (an unrecognised key is
|
|
157
|
+
* NAMED as unknown), and a list that is missing keys over-reports rather than
|
|
158
|
+
* under-reports. An empty list would name every key unknown, which is louder
|
|
159
|
+
* still but tells a reader nothing; a permissive one would silence the warning
|
|
160
|
+
* the APRV-111 incident added.
|
|
161
|
+
*/
|
|
162
|
+
const FALLBACK_TOP_LEVEL_KEYS = [
|
|
163
|
+
"approvers",
|
|
164
|
+
"audit",
|
|
165
|
+
"budgets",
|
|
166
|
+
"channels",
|
|
167
|
+
"classes",
|
|
168
|
+
"defaults",
|
|
169
|
+
"payload_retention",
|
|
170
|
+
"protected_paths",
|
|
171
|
+
"vault",
|
|
172
|
+
"version",
|
|
173
|
+
];
|
|
174
|
+
/** Memoised across a process; see {@link policyTopLevelKeys}. */
|
|
175
|
+
let topLevelKeys = null;
|
|
176
|
+
/**
|
|
177
|
+
* SPEC.md §5.2's top-level policy keys, READ FROM `policy.schema.json`
|
|
178
|
+
* (APRV-296).
|
|
179
|
+
*
|
|
180
|
+
* Used for ONE decision: whether a key the document carries is part of the
|
|
181
|
+
* vocabulary at all. It is not used to decide what to walk — the documents' own
|
|
182
|
+
* keys decide that — so this list only ever changes what a key is CALLED in the
|
|
183
|
+
* report.
|
|
184
|
+
*
|
|
185
|
+
* It used to be a second, hand-written copy of the schema's top-level
|
|
186
|
+
* `properties`, and the 2026-09-07 ceremony is what a hand-written copy costs:
|
|
187
|
+
* the amend diff printed `daemon.full_reproof_after: 60s -> 60s (UNKNOWN KEY:
|
|
188
|
+
* … the policy FAILS CLOSED to all-manual until it is removed)` for three
|
|
189
|
+
* `daemon.*` keys the schema had admitted since APRV-217, which the same
|
|
190
|
+
* ceremony then loaded cleanly and resolved every pin against. A false
|
|
191
|
+
* fail-closed warning in a ceremony's output is worse than no warning: it
|
|
192
|
+
* teaches the operator reading it that the warnings are noise.
|
|
193
|
+
*
|
|
194
|
+
* Reading the schema is the fix that cannot go stale, because the schema is
|
|
195
|
+
* what actually decides whether the key loads. The read is memoised for the
|
|
196
|
+
* life of the process, which `core/validate.ts` deliberately does not do for
|
|
197
|
+
* validation: this is DISPLAY vocabulary over a file shipped with the package,
|
|
198
|
+
* not a verdict, and a schema edited under a running process changes what the
|
|
199
|
+
* next diff CALLS a key rather than whether that key was validated.
|
|
200
|
+
*/
|
|
201
|
+
export function policyTopLevelKeys() {
|
|
202
|
+
if (topLevelKeys !== null)
|
|
203
|
+
return topLevelKeys;
|
|
204
|
+
topLevelKeys = readTopLevelKeys();
|
|
205
|
+
return topLevelKeys;
|
|
206
|
+
}
|
|
207
|
+
function readTopLevelKeys() {
|
|
208
|
+
try {
|
|
209
|
+
const parsed = JSON.parse(readFileSync(POLICY_SCHEMA_PATH, "utf8"));
|
|
210
|
+
if (!isRecord(parsed))
|
|
211
|
+
return FALLBACK_TOP_LEVEL_KEYS;
|
|
212
|
+
const properties = parsed["properties"];
|
|
213
|
+
if (!isRecord(properties))
|
|
214
|
+
return FALLBACK_TOP_LEVEL_KEYS;
|
|
215
|
+
const keys = Object.keys(properties).sort();
|
|
216
|
+
return keys.length === 0 ? FALLBACK_TOP_LEVEL_KEYS : keys;
|
|
217
|
+
}
|
|
218
|
+
catch {
|
|
219
|
+
return FALLBACK_TOP_LEVEL_KEYS;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* The one key the vocabulary walk skips: the classes map is the classes
|
|
224
|
+
* section's subject, and printing its raw text beside the resolution changes
|
|
225
|
+
* would say the same thing twice, less usefully.
|
|
226
|
+
*/
|
|
227
|
+
const VOCABULARY_SKIP_TOP_LEVEL = "classes";
|
|
228
|
+
function policyOf(load) {
|
|
229
|
+
return load.ok ? load.policy : null;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* The document as parsed, for the vocabulary walk: the loaded policy when the
|
|
233
|
+
* load succeeded, the rejected-but-parsed value when the schema said no, and
|
|
234
|
+
* `undefined` when there was never a value (missing file, no block, bad YAML).
|
|
235
|
+
*
|
|
236
|
+
* DISPLAY ONLY. Nothing in this module resolves an action against it.
|
|
237
|
+
*/
|
|
238
|
+
function rawOf(load) {
|
|
239
|
+
return load.ok ? load.policy : load.raw;
|
|
240
|
+
}
|
|
241
|
+
function isRecord(value) {
|
|
242
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
243
|
+
}
|
|
244
|
+
/** A value rendered for a human to read: scalars as themselves, the rest JSON. */
|
|
245
|
+
function renderValue(value) {
|
|
246
|
+
if (typeof value === "string")
|
|
247
|
+
return value;
|
|
248
|
+
if (typeof value === "number" || typeof value === "boolean")
|
|
249
|
+
return String(value);
|
|
250
|
+
return JSON.stringify(value) ?? String(value);
|
|
251
|
+
}
|
|
252
|
+
/** Flatten nested mappings to dotted paths; sequences and scalars are leaves. */
|
|
253
|
+
function flatten(value, prefix, out) {
|
|
254
|
+
if (isRecord(value)) {
|
|
255
|
+
const keys = Object.keys(value).sort();
|
|
256
|
+
if (keys.length === 0) {
|
|
257
|
+
out.set(prefix, "{}");
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
for (const key of keys) {
|
|
261
|
+
flatten(value[key], prefix === "" ? key : `${prefix}.${key}`, out);
|
|
262
|
+
}
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
out.set(prefix, renderValue(value));
|
|
266
|
+
}
|
|
267
|
+
/** Every dotted path of a policy document, or `null` when there is no document. */
|
|
268
|
+
function vocabularyTable(raw) {
|
|
269
|
+
if (!isRecord(raw))
|
|
270
|
+
return null;
|
|
271
|
+
const table = new Map();
|
|
272
|
+
for (const key of Object.keys(raw).sort()) {
|
|
273
|
+
if (key === VOCABULARY_SKIP_TOP_LEVEL)
|
|
274
|
+
continue;
|
|
275
|
+
flatten(raw[key], key, table);
|
|
276
|
+
}
|
|
277
|
+
return table;
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Is this path already reported by one of the four dedicated sections?
|
|
281
|
+
*
|
|
282
|
+
* Only asked when those sections actually ran (`structuralComparable`): a side
|
|
283
|
+
* that failed to load leaves them empty, and dropping the path then would hide
|
|
284
|
+
* the change entirely rather than avoid repeating it.
|
|
285
|
+
*/
|
|
286
|
+
function coveredByDedicatedSection(path) {
|
|
287
|
+
const parts = path.split(".");
|
|
288
|
+
if (parts[0] === "defaults") {
|
|
289
|
+
return parts.length === 2 && DEFAULT_FIELDS.includes(parts[1]);
|
|
290
|
+
}
|
|
291
|
+
if (parts[0] === "approvers")
|
|
292
|
+
return parts.length === 3 && parts[2] === "channels";
|
|
293
|
+
if (parts[0] === "budgets")
|
|
294
|
+
return parts.length === 3;
|
|
295
|
+
return false;
|
|
296
|
+
}
|
|
297
|
+
function diffVocabulary(before, after, structuralComparable) {
|
|
298
|
+
const beforeTable = vocabularyTable(before);
|
|
299
|
+
const afterTable = vocabularyTable(after);
|
|
300
|
+
if (beforeTable === null || afterTable === null)
|
|
301
|
+
return { comparable: false, changes: [] };
|
|
302
|
+
const vocabulary = policyTopLevelKeys();
|
|
303
|
+
const changes = [];
|
|
304
|
+
for (const key of union([...beforeTable.keys()], [...afterTable.keys()])) {
|
|
305
|
+
const recognised = vocabulary.includes(key.split(".")[0] ?? key);
|
|
306
|
+
const previous = beforeTable.get(key) ?? null;
|
|
307
|
+
const next = afterTable.get(key) ?? null;
|
|
308
|
+
// An unrecognised key is reported whether or not it moved: it is why the
|
|
309
|
+
// policy fails closed, and a reader shown "no change" would never learn it.
|
|
310
|
+
if (recognised && previous === next)
|
|
311
|
+
continue;
|
|
312
|
+
if (recognised && structuralComparable && coveredByDedicatedSection(key))
|
|
313
|
+
continue;
|
|
314
|
+
changes.push({ key, recognised, before: previous, after: next });
|
|
315
|
+
}
|
|
316
|
+
return { comparable: true, changes };
|
|
317
|
+
}
|
|
318
|
+
function failureOf(load) {
|
|
319
|
+
return load.ok ? null : { code: load.code, message: load.message };
|
|
320
|
+
}
|
|
321
|
+
function snapshot(load, probe) {
|
|
322
|
+
return snapshotFor(load, probe, false);
|
|
323
|
+
}
|
|
324
|
+
function irreversibleSnapshot(load, probe) {
|
|
325
|
+
return snapshotFor(load, probe, true);
|
|
326
|
+
}
|
|
327
|
+
function snapshotFor(load, probe, irreversible) {
|
|
328
|
+
const resolution = resolve(load, probe, irreversible ? { reversible: false } : {});
|
|
329
|
+
return {
|
|
330
|
+
autonomy: resolution.autonomy,
|
|
331
|
+
provenance: resolution.provenance,
|
|
332
|
+
pattern: resolution.matched?.pattern ?? null,
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
function sameSnapshot(a, b) {
|
|
336
|
+
return a.autonomy === b.autonomy && a.provenance === b.provenance && a.pattern === b.pattern;
|
|
337
|
+
}
|
|
338
|
+
/** Sorted, de-duplicated union of the given string lists. */
|
|
339
|
+
function union(...lists) {
|
|
340
|
+
const seen = new Set();
|
|
341
|
+
for (const list of lists)
|
|
342
|
+
for (const item of list)
|
|
343
|
+
seen.add(item);
|
|
344
|
+
return [...seen].sort();
|
|
345
|
+
}
|
|
346
|
+
function classKeys(policy) {
|
|
347
|
+
return policy?.classes === undefined ? [] : Object.keys(policy.classes);
|
|
348
|
+
}
|
|
349
|
+
function channelsOf(policy, approver) {
|
|
350
|
+
const entry = policy?.approvers?.[approver];
|
|
351
|
+
return entry === undefined ? null : [...entry.channels];
|
|
352
|
+
}
|
|
353
|
+
function sameChannels(a, b) {
|
|
354
|
+
if (a === null || b === null)
|
|
355
|
+
return a === b;
|
|
356
|
+
if (a.length !== b.length)
|
|
357
|
+
return false;
|
|
358
|
+
return a.every((value, index) => value === b[index]);
|
|
359
|
+
}
|
|
360
|
+
function defaultValue(policy, field) {
|
|
361
|
+
const defaults = policy?.defaults;
|
|
362
|
+
if (defaults === undefined)
|
|
363
|
+
return null;
|
|
364
|
+
const value = defaults[field];
|
|
365
|
+
return value === undefined ? null : String(value);
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* Key separator for the `(scope, limit)` table below. A control character, not
|
|
369
|
+
* a dot or a space: scope names come from a policy file and limit names are
|
|
370
|
+
* open-ended (SPEC.md §7's taxonomy grows), so any printable separator could
|
|
371
|
+
* one day appear inside a key and split it in the wrong place.
|
|
372
|
+
*/
|
|
373
|
+
const SEPARATOR = "\u0000";
|
|
374
|
+
/**
|
|
375
|
+
* Every `(scope, limit)` pair a policy declares: `budgets.<scope>.<limit>`
|
|
376
|
+
* flattened to `(scope, limit)`, and each class rule's `limits` flattened to
|
|
377
|
+
* `(classes.<pattern>, limit)`.
|
|
378
|
+
*/
|
|
379
|
+
function limitTable(policy) {
|
|
380
|
+
const table = new Map();
|
|
381
|
+
if (policy === null)
|
|
382
|
+
return table;
|
|
383
|
+
for (const [scope, entry] of Object.entries(policy.budgets ?? {})) {
|
|
384
|
+
for (const [limit, value] of Object.entries(entry)) {
|
|
385
|
+
if (typeof value === "number")
|
|
386
|
+
table.set(`${scope}${SEPARATOR}${limit}`, value);
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
for (const [pattern, rule] of Object.entries(policy.classes ?? {})) {
|
|
390
|
+
for (const [limit, value] of Object.entries(rule.limits ?? {})) {
|
|
391
|
+
table.set(`classes.${pattern}${SEPARATOR}${limit}`, value);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
return table;
|
|
395
|
+
}
|
|
396
|
+
/** Class patterns whose rule names `approver`, sorted. */
|
|
397
|
+
function rulesNaming(policy, approver) {
|
|
398
|
+
const patterns = [];
|
|
399
|
+
for (const [pattern, rule] of Object.entries(policy?.classes ?? {})) {
|
|
400
|
+
if ((rule.approvers ?? []).includes(approver))
|
|
401
|
+
patterns.push(pattern);
|
|
402
|
+
}
|
|
403
|
+
return patterns.sort();
|
|
404
|
+
}
|
|
405
|
+
function diffApprovers(before, after) {
|
|
406
|
+
const names = union(Object.keys(before?.approvers ?? {}), Object.keys(after?.approvers ?? {}));
|
|
407
|
+
const changes = [];
|
|
408
|
+
for (const approver of names) {
|
|
409
|
+
const beforeChannels = channelsOf(before, approver);
|
|
410
|
+
const afterChannels = channelsOf(after, approver);
|
|
411
|
+
if (sameChannels(beforeChannels, afterChannels))
|
|
412
|
+
continue;
|
|
413
|
+
const change = beforeChannels === null ? "added" : afterChannels === null ? "removed" : "channels-changed";
|
|
414
|
+
changes.push({
|
|
415
|
+
approver,
|
|
416
|
+
change,
|
|
417
|
+
beforeChannels,
|
|
418
|
+
afterChannels,
|
|
419
|
+
danglingRules: afterChannels === null ? rulesNaming(after, approver) : [],
|
|
420
|
+
});
|
|
421
|
+
}
|
|
422
|
+
return changes;
|
|
423
|
+
}
|
|
424
|
+
function diffDefaults(before, after) {
|
|
425
|
+
const changes = [];
|
|
426
|
+
for (const field of DEFAULT_FIELDS) {
|
|
427
|
+
const previous = defaultValue(before, field);
|
|
428
|
+
const next = defaultValue(after, field);
|
|
429
|
+
if (previous === next)
|
|
430
|
+
continue;
|
|
431
|
+
changes.push({ field, before: previous, after: next });
|
|
432
|
+
}
|
|
433
|
+
return changes;
|
|
434
|
+
}
|
|
435
|
+
function diffBudgets(before, after) {
|
|
436
|
+
const beforeTable = limitTable(before);
|
|
437
|
+
const afterTable = limitTable(after);
|
|
438
|
+
const keys = union([...beforeTable.keys()], [...afterTable.keys()]);
|
|
439
|
+
const changes = [];
|
|
440
|
+
for (const key of keys) {
|
|
441
|
+
const previous = beforeTable.get(key) ?? null;
|
|
442
|
+
const next = afterTable.get(key) ?? null;
|
|
443
|
+
if (previous === next)
|
|
444
|
+
continue;
|
|
445
|
+
const separator = key.indexOf(SEPARATOR);
|
|
446
|
+
changes.push({
|
|
447
|
+
scope: key.slice(0, separator),
|
|
448
|
+
limit: key.slice(separator + 1),
|
|
449
|
+
before: previous,
|
|
450
|
+
after: next,
|
|
451
|
+
});
|
|
452
|
+
}
|
|
453
|
+
return changes;
|
|
454
|
+
}
|
|
455
|
+
/**
|
|
456
|
+
* Diff two loaded policies by what the engine answers under each.
|
|
457
|
+
*
|
|
458
|
+
* `before` and `after` are whole {@link PolicyLoadResult}s, failures included —
|
|
459
|
+
* see the module header for why a failed side is reported rather than treated
|
|
460
|
+
* as empty. `sampleClasses` widens the probe set beyond the two policies' own
|
|
461
|
+
* class keys; the CLI supplies {@link SPEC_NAMESPACES}.
|
|
462
|
+
*/
|
|
463
|
+
export function diffPolicies(before, after, sampleClasses = []) {
|
|
464
|
+
const beforePolicy = policyOf(before);
|
|
465
|
+
const afterPolicy = policyOf(after);
|
|
466
|
+
const probes = union(classKeys(beforePolicy), classKeys(afterPolicy), sampleClasses);
|
|
467
|
+
const classes = [];
|
|
468
|
+
for (const probe of probes) {
|
|
469
|
+
const previous = snapshot(before, probe);
|
|
470
|
+
const next = snapshot(after, probe);
|
|
471
|
+
const previousIrreversible = irreversibleSnapshot(before, probe);
|
|
472
|
+
const nextIrreversible = irreversibleSnapshot(after, probe);
|
|
473
|
+
const ordinaryChanged = !sameSnapshot(previous, next);
|
|
474
|
+
const irreversibleChanged = !sameSnapshot(previousIrreversible, nextIrreversible);
|
|
475
|
+
if (!ordinaryChanged && !irreversibleChanged)
|
|
476
|
+
continue;
|
|
477
|
+
const change = {
|
|
478
|
+
class: probe,
|
|
479
|
+
before: previous,
|
|
480
|
+
after: next,
|
|
481
|
+
};
|
|
482
|
+
if (irreversibleChanged) {
|
|
483
|
+
change.irreversible = { before: previousIrreversible, after: nextIrreversible };
|
|
484
|
+
}
|
|
485
|
+
classes.push(change);
|
|
486
|
+
}
|
|
487
|
+
const structuralComparable = before.ok && after.ok;
|
|
488
|
+
const approvers = structuralComparable ? diffApprovers(beforePolicy, afterPolicy) : [];
|
|
489
|
+
const defaults = structuralComparable ? diffDefaults(beforePolicy, afterPolicy) : [];
|
|
490
|
+
const budgets = structuralComparable ? diffBudgets(beforePolicy, afterPolicy) : [];
|
|
491
|
+
const vocabulary = diffVocabulary(rawOf(before), rawOf(after), structuralComparable);
|
|
492
|
+
return {
|
|
493
|
+
beforeFailure: failureOf(before),
|
|
494
|
+
afterFailure: failureOf(after),
|
|
495
|
+
structuralComparable,
|
|
496
|
+
probes,
|
|
497
|
+
classes,
|
|
498
|
+
approvers,
|
|
499
|
+
defaults,
|
|
500
|
+
budgets,
|
|
501
|
+
vocabulary: vocabulary.changes,
|
|
502
|
+
vocabularyComparable: vocabulary.comparable,
|
|
503
|
+
unchanged: classes.length === 0 &&
|
|
504
|
+
approvers.length === 0 &&
|
|
505
|
+
defaults.length === 0 &&
|
|
506
|
+
budgets.length === 0 &&
|
|
507
|
+
vocabulary.changes.length === 0,
|
|
508
|
+
};
|
|
509
|
+
}
|
|
510
|
+
/**
|
|
511
|
+
* Render a {@link PolicyDiff} as the lines the CLI prints.
|
|
512
|
+
*
|
|
513
|
+
* Lives beside the diff rather than in the CLI for the same reason
|
|
514
|
+
* `decisionPath` lives in `policy-explain.ts`: the human rendering and the
|
|
515
|
+
* machine shape must be derived from one value, or they will eventually
|
|
516
|
+
* disagree about what changed.
|
|
517
|
+
*/
|
|
518
|
+
export function renderDiff(diff) {
|
|
519
|
+
const lines = [];
|
|
520
|
+
if (diff.beforeFailure !== null) {
|
|
521
|
+
lines.push(`before: everything manual (fail-closed: ${diff.beforeFailure.code}) — ${diff.beforeFailure.message}`);
|
|
522
|
+
}
|
|
523
|
+
if (diff.afterFailure !== null) {
|
|
524
|
+
lines.push(`after: everything manual (fail-closed: ${diff.afterFailure.code}) — ${diff.afterFailure.message}`);
|
|
525
|
+
}
|
|
526
|
+
if (diff.unchanged) {
|
|
527
|
+
// "no semantic change" is a claim about the WHOLE document, so it is only
|
|
528
|
+
// made when the whole document was read. When a side's YAML never parsed
|
|
529
|
+
// there are keys nobody looked at, and saying nothing changed would be the
|
|
530
|
+
// APRV-111 failure with a different cause.
|
|
531
|
+
lines.push(diff.vocabularyComparable
|
|
532
|
+
? `no semantic change: ${diff.probes.length} probed class(es) resolve the same, and every policy key is unchanged`
|
|
533
|
+
: `no class resolution changed over ${diff.probes.length} probed class(es), but the rest of the policy could NOT be compared (a side's YAML did not parse), so an edit outside the classes may be invisible here — read the file diff yourself`);
|
|
534
|
+
return lines;
|
|
535
|
+
}
|
|
536
|
+
if (diff.classes.length > 0) {
|
|
537
|
+
lines.push(`class resolutions changed (${diff.classes.length}):`);
|
|
538
|
+
for (const change of diff.classes) {
|
|
539
|
+
if (!sameSnapshot(change.before, change.after)) {
|
|
540
|
+
lines.push(` ${change.class}: ${describeSnapshot(change.before)} -> ${describeSnapshot(change.after)}`);
|
|
541
|
+
}
|
|
542
|
+
if (change.irreversible !== undefined) {
|
|
543
|
+
lines.push(` ${change.class} (reversible: false): ${describeSnapshot(change.irreversible.before)} -> ${describeSnapshot(change.irreversible.after)}`);
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
if (diff.approvers.length > 0) {
|
|
548
|
+
lines.push(`approvers changed (${diff.approvers.length}):`);
|
|
549
|
+
for (const change of diff.approvers) {
|
|
550
|
+
lines.push(` ${change.approver}: ${change.change} [${(change.beforeChannels ?? []).join(", ")}] -> [${(change.afterChannels ?? []).join(", ")}]${change.danglingRules.length === 0
|
|
551
|
+
? ""
|
|
552
|
+
: ` (UNREACHABLE: still named by ${change.danglingRules.join(", ")})`}`);
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
if (diff.defaults.length > 0) {
|
|
556
|
+
lines.push(`defaults changed (${diff.defaults.length}):`);
|
|
557
|
+
for (const change of diff.defaults) {
|
|
558
|
+
lines.push(` ${change.field}: ${change.before ?? "(absent)"} -> ${change.after ?? "(absent)"}`);
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
if (diff.budgets.length > 0) {
|
|
562
|
+
lines.push(`limits changed (${diff.budgets.length}):`);
|
|
563
|
+
for (const change of diff.budgets) {
|
|
564
|
+
lines.push(` ${change.scope}.${change.limit}: ${change.before ?? "(absent)"} -> ${change.after ?? "(absent)"}`);
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
if (diff.vocabulary.length > 0) {
|
|
568
|
+
lines.push(`policy keys changed (${diff.vocabulary.length}):`);
|
|
569
|
+
for (const change of diff.vocabulary) {
|
|
570
|
+
const values = `${change.before ?? "(absent)"} -> ${change.after ?? "(absent)"}`;
|
|
571
|
+
lines.push(change.recognised
|
|
572
|
+
? ` ${change.key}: ${values}`
|
|
573
|
+
: ` ${change.key}: ${values} (UNKNOWN KEY: not part of the policy vocabulary, so the policy FAILS CLOSED to all-manual until it is removed)`);
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
if (!diff.vocabularyComparable) {
|
|
577
|
+
lines.push("the policy keys were NOT compared: a side's YAML did not parse, so there was no document to walk. A change outside the classes is not visible above");
|
|
578
|
+
}
|
|
579
|
+
if (!diff.structuralComparable) {
|
|
580
|
+
lines.push("approvers, defaults and limits were NOT compared: a policy that fails to load has no structure to read, and reporting it as empty would claim removals that never happened");
|
|
581
|
+
}
|
|
582
|
+
return lines;
|
|
583
|
+
}
|
|
584
|
+
function describeSnapshot(snap) {
|
|
585
|
+
const source = snap.pattern === null ? snap.provenance : `${snap.provenance} ${snap.pattern}`;
|
|
586
|
+
return `${snap.autonomy} (${source})`;
|
|
587
|
+
}
|
|
588
|
+
//# sourceMappingURL=policy-diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy-diff.js","sourceRoot":"","sources":["../../../src/core/policy-diff.ts"],"names":[],"mappings":"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"}
|