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,199 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Policy PINS: what a policy file is expected to resolve to, as data (APRV-203).
|
|
3
|
+
*
|
|
4
|
+
* The repository's own policy file has always been pinned: the dogfood suite in
|
|
5
|
+
* `tests/` asserts the autonomy and provenance the matcher resolves for every class
|
|
6
|
+
* the policy declares, so an edit that changes what the gate does fails `npm test`
|
|
7
|
+
* rather than being discovered by an agent doing something it should not have been
|
|
8
|
+
* allowed to do. The pins lived inside that test file, which meant the amendment
|
|
9
|
+
* ceremony could not read them: `approval policy amend` would attest, commit and
|
|
10
|
+
* push a policy edit whose pins nobody had updated, and CI found out afterwards.
|
|
11
|
+
*
|
|
12
|
+
* So the pins moved here, to a module the test and the ceremony both import, and
|
|
13
|
+
* `policy amend` runs {@link checkPolicyExpectations} against the AMENDED file
|
|
14
|
+
* before it pushes anything. One home for the pins; two readers.
|
|
15
|
+
*
|
|
16
|
+
* ## Why this module knows about one particular repository
|
|
17
|
+
*
|
|
18
|
+
* These pins are facts about approval.md's own policy, and no other repository's
|
|
19
|
+
* policy has anything to do with them. {@link expectationsFor} therefore answers
|
|
20
|
+
* them only when the policy being amended belongs to the `approval-md` package
|
|
21
|
+
* itself, and answers `null` everywhere else, where the ceremony simply says it
|
|
22
|
+
* has no expectation set to check. A shipped CLI that applied this repository's
|
|
23
|
+
* pins to a user's policy would refuse every amendment they ever made.
|
|
24
|
+
*/
|
|
25
|
+
import type { Autonomy, PolicyLoadResult } from "./policy-load.js";
|
|
26
|
+
import { type Provenance } from "./policy-match.js";
|
|
27
|
+
/** One pinned class resolution. */
|
|
28
|
+
export interface PolicyExpectation {
|
|
29
|
+
actionClass: string;
|
|
30
|
+
autonomy: Autonomy;
|
|
31
|
+
provenance: Provenance;
|
|
32
|
+
/** Why this pin reads the way it does. Printed with a failure. */
|
|
33
|
+
note?: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* The pins for this repository's `APPROVAL.md`.
|
|
37
|
+
*
|
|
38
|
+
* ## What earns a pin (APRV-296)
|
|
39
|
+
*
|
|
40
|
+
* A pin is a class whose LOOSENING is a security regression, so the ceremony
|
|
41
|
+
* refuses before the bytes are attested rather than after CI reads them. Three
|
|
42
|
+
* families qualify and nothing else does: the `human-only` classes, where a
|
|
43
|
+
* looser level would mint agent authority over the gate's own organs; the
|
|
44
|
+
* `manual` classes whose looser level puts an irreversible or third-party
|
|
45
|
+
* effect behind no human; and the fail-closed DEFAULT itself, pinned through
|
|
46
|
+
* classes the policy deliberately does not declare, so a policy that stopped
|
|
47
|
+
* defaulting to `manual` fails here even though every declared class still
|
|
48
|
+
* resolves as written. Each pin's note says which of those it is and what the
|
|
49
|
+
* loosening would cost.
|
|
50
|
+
*
|
|
51
|
+
* Until APRV-296 the list also pinned every OTHER class the policy declared,
|
|
52
|
+
* in both directions, and the 2026-09-07 ceremony is what that cost: a one-line
|
|
53
|
+
* TTL change plus one newly declared class turned into three failed runs,
|
|
54
|
+
* because tuning `vcs.pr.create` or `log.advance` was also a code change to be
|
|
55
|
+
* built before the ceremony would accept it. Those pins protected nothing —
|
|
56
|
+
* loosening a class that is already `autonomous` is not a direction, and the
|
|
57
|
+
* dangerous direction for `vcs.push.main` is held by the irreversibility floor
|
|
58
|
+
* (SPEC.md §7), which `tests/dogfood.test.ts` pins on its own. Every
|
|
59
|
+
* resolution change, pinned or not, still prints in the ceremony's semantic
|
|
60
|
+
* diff and is still attested by a human who read it.
|
|
61
|
+
*
|
|
62
|
+
* A class this list does NOT name is accepted, in the ceremony and in the
|
|
63
|
+
* dogfood suite alike: declaring a new `supervised` or `autonomous` class is a
|
|
64
|
+
* policy amendment and needs no code change. The other direction still fails —
|
|
65
|
+
* a pin naming a class the policy no longer resolves that way is a refusal,
|
|
66
|
+
* which is the whole point of the list.
|
|
67
|
+
*/
|
|
68
|
+
export declare const REPO_POLICY_EXPECTATIONS: readonly PolicyExpectation[];
|
|
69
|
+
/**
|
|
70
|
+
* One way the amended policy failed its pins. Machine-readable by `kind`.
|
|
71
|
+
*
|
|
72
|
+
* `unpinned` was a fourth kind until APRV-296, raised when the policy declared
|
|
73
|
+
* a class this list did not name. It is gone with the rule that produced it: a
|
|
74
|
+
* declared class carrying no pin is now accepted, so declaring a `supervised`
|
|
75
|
+
* or `autonomous` class is a policy amendment and not also a code change.
|
|
76
|
+
*/
|
|
77
|
+
export interface ExpectationFailure {
|
|
78
|
+
kind: "resolution" | "floor" | "unreachable";
|
|
79
|
+
actionClass: string;
|
|
80
|
+
expected: string;
|
|
81
|
+
actual: string;
|
|
82
|
+
note?: string;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* One pin, as the source line a human pastes into {@link REPO_POLICY_EXPECTATIONS}.
|
|
86
|
+
*
|
|
87
|
+
* The single-line form the list already uses for a pin with no note. A pin
|
|
88
|
+
* worth a note gets one from the person who knows why it reads that way, which
|
|
89
|
+
* is not something a resolution can supply — and since APRV-296 every pin in
|
|
90
|
+
* that list is worth a note, because a pin exists only where loosening the
|
|
91
|
+
* class would be a regression and the note is where that argument is written.
|
|
92
|
+
*
|
|
93
|
+
* No refusal prints this line any more. The ceremony used to hand it to an
|
|
94
|
+
* operator whose policy declared an unpinned class; nothing is unpinned now, so
|
|
95
|
+
* this is the spelling a human uses when they decide a NEW class belongs in the
|
|
96
|
+
* safety set. Printed, never applied: no verb in this repository writes the
|
|
97
|
+
* pins file.
|
|
98
|
+
*/
|
|
99
|
+
export declare function pinLine(actionClass: string, autonomy: string, provenance: string): string;
|
|
100
|
+
/** One line per failure, in the shape a terminal and a `--json` array share. */
|
|
101
|
+
export declare function describeFailure(failure: ExpectationFailure): string;
|
|
102
|
+
/**
|
|
103
|
+
* Check a loaded policy against its pins.
|
|
104
|
+
*
|
|
105
|
+
* Three ways to fail. A pinned class that no longer resolves as pinned is the
|
|
106
|
+
* one the list exists for: the pins name only classes whose loosening is a
|
|
107
|
+
* regression (APRV-296), so a failure here is a policy that moved one of them.
|
|
108
|
+
* A pinned resolution the irreversibility floor decided is a pin that stopped
|
|
109
|
+
* measuring the rule. And a class the command classifier cannot emit is a
|
|
110
|
+
* policy line that will never fire.
|
|
111
|
+
*
|
|
112
|
+
* What is NOT a failure, since APRV-296: a class the policy declares and this
|
|
113
|
+
* list does not pin. The pins are a safety floor rather than an inventory, and
|
|
114
|
+
* a policy declaring a new `supervised` or `autonomous` class needs no code
|
|
115
|
+
* change to be accepted. The resolution still prints in the ceremony's semantic
|
|
116
|
+
* diff, where a human reads it before attesting.
|
|
117
|
+
*/
|
|
118
|
+
export declare function checkPolicyExpectations(load: PolicyLoadResult, expectations: readonly PolicyExpectation[]): {
|
|
119
|
+
ok: boolean;
|
|
120
|
+
failures: ExpectationFailure[];
|
|
121
|
+
};
|
|
122
|
+
/** The name of the module a human edits when a pin has to move. */
|
|
123
|
+
export declare const EXPECTATIONS_MODULE = "src/core/policy-expectations.ts";
|
|
124
|
+
/**
|
|
125
|
+
* The dogfood suite, in source and as the build output that actually runs
|
|
126
|
+
* (APRV-274). Repo-relative, so a caller joins them onto the repository root.
|
|
127
|
+
*
|
|
128
|
+
* Both spellings are needed and they answer different questions. The SOURCE
|
|
129
|
+
* says whether this repository has a dogfood suite at all, which is what keeps
|
|
130
|
+
* the ceremony inert in somebody else's checkout. The BUILT file is what a
|
|
131
|
+
* ceremony runs, and its absence beside a present source is a stale build: the
|
|
132
|
+
* pins the suite would read are the ones in `dist/`, so a ceremony that ran the
|
|
133
|
+
* suite there would be checking the previous edit's pins.
|
|
134
|
+
*/
|
|
135
|
+
export declare const DOGFOOD_SUITE_SOURCE = "tests/dogfood.test.ts";
|
|
136
|
+
export declare const DOGFOOD_SUITE_BUILT = "dist/tests/dogfood.test.js";
|
|
137
|
+
/** One pin as the source text spells it: what class, resolving to what. */
|
|
138
|
+
export interface PinSourceEntry {
|
|
139
|
+
actionClass: string;
|
|
140
|
+
/** `autonomy/provenance` as written, or `null` where the text is unreadable. */
|
|
141
|
+
resolution: string | null;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* How one class's pin moved between two versions of the pins module.
|
|
145
|
+
*
|
|
146
|
+
* `null` on a side means the class was NOT PINNED in that version, and it is
|
|
147
|
+
* the only thing it means: an entry whose resolution the reader could not make
|
|
148
|
+
* out reads `"unreadable"` there, so "nobody pinned this" and "the pin is
|
|
149
|
+
* written in a shape this reader does not know" never arrive as the same fact.
|
|
150
|
+
*/
|
|
151
|
+
export interface PinChange {
|
|
152
|
+
actionClass: string;
|
|
153
|
+
before: string | null;
|
|
154
|
+
after: string | null;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* The pins a version of the module TEXT declares (APRV-274).
|
|
158
|
+
*
|
|
159
|
+
* A DISPLAY reader and nothing else. It exists so the amendment ceremony can
|
|
160
|
+
* show what the pins file did between the commit it is built on and the working
|
|
161
|
+
* tree, and the committed side of that comparison is a git blob: TypeScript
|
|
162
|
+
* source, with no build output to import. Nothing here gates anything. The pin
|
|
163
|
+
* check that can refuse a ceremony resolves the COMPILED
|
|
164
|
+
* {@link REPO_POLICY_EXPECTATIONS} against a loaded policy, exactly as it did
|
|
165
|
+
* before this function existed, so a text this reader misreads costs a report
|
|
166
|
+
* line and never a wrong verdict.
|
|
167
|
+
*
|
|
168
|
+
* The read is lexical and SCOPED to the named array literal, which matters:
|
|
169
|
+
* this very module mentions `actionClass` outside the pins (in the failure it
|
|
170
|
+
* builds for a policy that does not parse), and a reader that swept the whole
|
|
171
|
+
* file would report that mention as a pin. Inside the array, entries are split
|
|
172
|
+
* on `actionClass:`, and within one entry the first `autonomy:` and
|
|
173
|
+
* `provenance:` string literals are its resolution. That holds for a list
|
|
174
|
+
* written in the shape this module's own list is written in, where both fields
|
|
175
|
+
* precede the free-text `note`. An entry it cannot read is reported with a
|
|
176
|
+
* `null` resolution rather than dropped, so a pin that moved is never silently
|
|
177
|
+
* absent from the report.
|
|
178
|
+
*/
|
|
179
|
+
export declare function readPinSource(text: string, constant?: string): PinSourceEntry[];
|
|
180
|
+
/**
|
|
181
|
+
* How the pins moved from one version of the module text to another, sorted by
|
|
182
|
+
* class so two runs of the same ceremony print the same report.
|
|
183
|
+
*
|
|
184
|
+
* A class pinned twice in one version keeps the FIRST reading, which is what
|
|
185
|
+
* the compiled list resolves to as well: {@link checkPolicyExpectations} walks
|
|
186
|
+
* the array in order and a duplicate cannot change an earlier entry's verdict.
|
|
187
|
+
*/
|
|
188
|
+
export declare function diffPinSources(before: string, after: string): PinChange[];
|
|
189
|
+
/** One pin change on one line, for a terminal and for a `--json` array. */
|
|
190
|
+
export declare function describePinChange(change: PinChange): string;
|
|
191
|
+
/**
|
|
192
|
+
* The pins that govern `policyPath`, or `null` when none do.
|
|
193
|
+
*
|
|
194
|
+
* The test is package identity and nothing looser: the nearest `package.json`
|
|
195
|
+
* above the policy file names `approval-md`. A copy of the policy carried into
|
|
196
|
+
* some other repository is not this repository's policy, and a user's own
|
|
197
|
+
* `APPROVAL.md` is nobody's business but theirs.
|
|
198
|
+
*/
|
|
199
|
+
export declare function expectationsFor(policyPath: string): readonly PolicyExpectation[] | null;
|
|
@@ -0,0 +1,394 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Policy PINS: what a policy file is expected to resolve to, as data (APRV-203).
|
|
3
|
+
*
|
|
4
|
+
* The repository's own policy file has always been pinned: the dogfood suite in
|
|
5
|
+
* `tests/` asserts the autonomy and provenance the matcher resolves for every class
|
|
6
|
+
* the policy declares, so an edit that changes what the gate does fails `npm test`
|
|
7
|
+
* rather than being discovered by an agent doing something it should not have been
|
|
8
|
+
* allowed to do. The pins lived inside that test file, which meant the amendment
|
|
9
|
+
* ceremony could not read them: `approval policy amend` would attest, commit and
|
|
10
|
+
* push a policy edit whose pins nobody had updated, and CI found out afterwards.
|
|
11
|
+
*
|
|
12
|
+
* So the pins moved here, to a module the test and the ceremony both import, and
|
|
13
|
+
* `policy amend` runs {@link checkPolicyExpectations} against the AMENDED file
|
|
14
|
+
* before it pushes anything. One home for the pins; two readers.
|
|
15
|
+
*
|
|
16
|
+
* ## Why this module knows about one particular repository
|
|
17
|
+
*
|
|
18
|
+
* These pins are facts about approval.md's own policy, and no other repository's
|
|
19
|
+
* policy has anything to do with them. {@link expectationsFor} therefore answers
|
|
20
|
+
* them only when the policy being amended belongs to the `approval-md` package
|
|
21
|
+
* itself, and answers `null` everywhere else, where the ceremony simply says it
|
|
22
|
+
* has no expectation set to check. A shipped CLI that applied this repository's
|
|
23
|
+
* pins to a user's policy would refuse every amendment they ever made.
|
|
24
|
+
*/
|
|
25
|
+
import { readFileSync } from "node:fs";
|
|
26
|
+
import { dirname, join } from "node:path";
|
|
27
|
+
import { emittableClass } from "./command-class.js";
|
|
28
|
+
import { resolve } from "./policy-match.js";
|
|
29
|
+
/**
|
|
30
|
+
* The pins for this repository's `APPROVAL.md`.
|
|
31
|
+
*
|
|
32
|
+
* ## What earns a pin (APRV-296)
|
|
33
|
+
*
|
|
34
|
+
* A pin is a class whose LOOSENING is a security regression, so the ceremony
|
|
35
|
+
* refuses before the bytes are attested rather than after CI reads them. Three
|
|
36
|
+
* families qualify and nothing else does: the `human-only` classes, where a
|
|
37
|
+
* looser level would mint agent authority over the gate's own organs; the
|
|
38
|
+
* `manual` classes whose looser level puts an irreversible or third-party
|
|
39
|
+
* effect behind no human; and the fail-closed DEFAULT itself, pinned through
|
|
40
|
+
* classes the policy deliberately does not declare, so a policy that stopped
|
|
41
|
+
* defaulting to `manual` fails here even though every declared class still
|
|
42
|
+
* resolves as written. Each pin's note says which of those it is and what the
|
|
43
|
+
* loosening would cost.
|
|
44
|
+
*
|
|
45
|
+
* Until APRV-296 the list also pinned every OTHER class the policy declared,
|
|
46
|
+
* in both directions, and the 2026-09-07 ceremony is what that cost: a one-line
|
|
47
|
+
* TTL change plus one newly declared class turned into three failed runs,
|
|
48
|
+
* because tuning `vcs.pr.create` or `log.advance` was also a code change to be
|
|
49
|
+
* built before the ceremony would accept it. Those pins protected nothing —
|
|
50
|
+
* loosening a class that is already `autonomous` is not a direction, and the
|
|
51
|
+
* dangerous direction for `vcs.push.main` is held by the irreversibility floor
|
|
52
|
+
* (SPEC.md §7), which `tests/dogfood.test.ts` pins on its own. Every
|
|
53
|
+
* resolution change, pinned or not, still prints in the ceremony's semantic
|
|
54
|
+
* diff and is still attested by a human who read it.
|
|
55
|
+
*
|
|
56
|
+
* A class this list does NOT name is accepted, in the ceremony and in the
|
|
57
|
+
* dogfood suite alike: declaring a new `supervised` or `autonomous` class is a
|
|
58
|
+
* policy amendment and needs no code change. The other direction still fails —
|
|
59
|
+
* a pin naming a class the policy no longer resolves that way is a refusal,
|
|
60
|
+
* which is the whole point of the list.
|
|
61
|
+
*/
|
|
62
|
+
export const REPO_POLICY_EXPECTATIONS = [
|
|
63
|
+
// ---------------------------------------------------------------------
|
|
64
|
+
// human-only — a person acts; no verb mints or withdraws authority
|
|
65
|
+
// (APRV-185); declared at the seq 7355 ceremony. Loosening ANY of these to a
|
|
66
|
+
// level an agent can reach is the regression SPEC.md §11.1 invariant 9
|
|
67
|
+
// forbids: these four are the gate's own organs and the record of what
|
|
68
|
+
// happened, and a policy may not grant an agent authority over them.
|
|
69
|
+
// ---------------------------------------------------------------------
|
|
70
|
+
{
|
|
71
|
+
actionClass: "vcs.history.rewrite",
|
|
72
|
+
autonomy: "human-only",
|
|
73
|
+
provenance: "rule",
|
|
74
|
+
note: "manual until seq 7355; a person rewrites shared history, never an agent. Loosened, an agent could rewrite the history that carries the log's commits, which is the evidence every later verification reads",
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
actionClass: "policy.core",
|
|
78
|
+
autonomy: "human-only",
|
|
79
|
+
provenance: "rule",
|
|
80
|
+
note: "APPROVAL.md and .approval/* outside the log; split out of policy.edit by APRV-198 so the 0.1 sample never sits on the gate's own organs. Loosened, an agent could edit the file that decides what agents may do, which is every other control at once",
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
actionClass: "log.mutate",
|
|
84
|
+
autonomy: "human-only",
|
|
85
|
+
provenance: "rule",
|
|
86
|
+
note: "any write aimed at .approval/log/ (APRV-198). Loosened, an agent could write the append-only log directly, and the log is the truth every projection and every verdict is rebuilt from",
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
actionClass: "account.credential",
|
|
90
|
+
autonomy: "human-only",
|
|
91
|
+
provenance: "rule",
|
|
92
|
+
note: "keychain readers, APPROVAL_*/TELEGRAM_*/VAULT_* probes, vault/keys/env reads (APRV-194). Loosened, an agent could read the channel and vault secrets, and an agent holding the approver's credentials can approve itself",
|
|
93
|
+
},
|
|
94
|
+
// ---------------------------------------------------------------------
|
|
95
|
+
// manual — the classes whose effects leave this repository or cannot be
|
|
96
|
+
// undone. Loosening one moves a human decision into an agent's own hands.
|
|
97
|
+
// ---------------------------------------------------------------------
|
|
98
|
+
{
|
|
99
|
+
actionClass: "deps.add",
|
|
100
|
+
autonomy: "manual",
|
|
101
|
+
provenance: "rule",
|
|
102
|
+
note: "loosened, an agent adds a package this project then runs, in the build and in CI: code nobody here reviewed, reaching the supply chain with no human in the path",
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
actionClass: "network.call",
|
|
106
|
+
autonomy: "manual",
|
|
107
|
+
provenance: "rule",
|
|
108
|
+
note: "re-tightened 2026-08-20 (attested seq 293) once APRV-114 taught the classifier that GET-shaped fetches are read.web, so this class now covers only the mutating and ambiguous remainder. Loosened, an agent could write to a third-party system, which is an effect no local revert reaches",
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
actionClass: "release.publish",
|
|
112
|
+
autonomy: "manual",
|
|
113
|
+
provenance: "rule",
|
|
114
|
+
note: "loosened, an agent could publish bytes to a public registry under this project's name; a published version is permanent, and users install what it ships",
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
actionClass: "policy.edit.ci",
|
|
118
|
+
autonomy: "manual",
|
|
119
|
+
provenance: "rule",
|
|
120
|
+
note: "routed from .github/workflows/ at the 2026-09-06 ceremony (APRV-266): every CI and release-configuration edit is a tap. Loosened, an agent could edit the workflows that are this repository's other enforcement path, including the job that runs this very check",
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
actionClass: "files.delete.out_of_scope",
|
|
124
|
+
autonomy: "manual",
|
|
125
|
+
provenance: "rule",
|
|
126
|
+
note: "loosened, an agent could delete files outside its task's stated scope, and a deletion is found by a reader missing something rather than by the gate",
|
|
127
|
+
},
|
|
128
|
+
// ---------------------------------------------------------------------
|
|
129
|
+
// the fail-closed DEFAULT, pinned through classes the policy does not
|
|
130
|
+
// declare. `defaults.autonomy: manual` is asserted directly by the dogfood
|
|
131
|
+
// suite; these three prove the same thing where it actually decides —
|
|
132
|
+
// an action nobody wrote a rule for. Loosening the default is the widest
|
|
133
|
+
// regression this file can catch: it grants every class nobody thought of.
|
|
134
|
+
// ---------------------------------------------------------------------
|
|
135
|
+
{
|
|
136
|
+
actionClass: "communicate.email.external",
|
|
137
|
+
autonomy: "manual",
|
|
138
|
+
provenance: "default",
|
|
139
|
+
note: "undeclared class: the absence of a grant is not a grant. Loosened (a permissive defaults.autonomy, or a wildcard rule that swallowed it), an agent could send mail to a third party under this operator's name without a decision anybody made",
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
actionClass: "deps.upgrade",
|
|
143
|
+
autonomy: "manual",
|
|
144
|
+
provenance: "default",
|
|
145
|
+
note: "undeclared, so the manual default holds; since APRV-228 the classifier emits it for the harness self-update verbs (claude/codex/gemini update, uca) as well as npm update. Loosened, an agent could move its own harness version or the dependency tree it runs on, unreviewed; a ceremony that declares the class moves this pin deliberately",
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
actionClass: "read",
|
|
149
|
+
autonomy: "manual",
|
|
150
|
+
provenance: "default",
|
|
151
|
+
// SPEC.md §5.2 (amended): a trailing `.*` matches ONE OR MORE segments, so
|
|
152
|
+
// `read.*` is the namespace *under* `read` and does not cover the bare class
|
|
153
|
+
// `read`. A policy wanting the bare class covered must list it as its own
|
|
154
|
+
// rule; the repo policy does not, so `read` falls to the manual default.
|
|
155
|
+
note: "bare namespace is NOT matched by read.* (SPEC.md §5.2). This pin holds the wildcard grammar itself: were `read.*` ever to cover the bare class, every read the classifier could not place would resolve autonomous instead of falling to the manual default",
|
|
156
|
+
},
|
|
157
|
+
];
|
|
158
|
+
/**
|
|
159
|
+
* One pin, as the source line a human pastes into {@link REPO_POLICY_EXPECTATIONS}.
|
|
160
|
+
*
|
|
161
|
+
* The single-line form the list already uses for a pin with no note. A pin
|
|
162
|
+
* worth a note gets one from the person who knows why it reads that way, which
|
|
163
|
+
* is not something a resolution can supply — and since APRV-296 every pin in
|
|
164
|
+
* that list is worth a note, because a pin exists only where loosening the
|
|
165
|
+
* class would be a regression and the note is where that argument is written.
|
|
166
|
+
*
|
|
167
|
+
* No refusal prints this line any more. The ceremony used to hand it to an
|
|
168
|
+
* operator whose policy declared an unpinned class; nothing is unpinned now, so
|
|
169
|
+
* this is the spelling a human uses when they decide a NEW class belongs in the
|
|
170
|
+
* safety set. Printed, never applied: no verb in this repository writes the
|
|
171
|
+
* pins file.
|
|
172
|
+
*/
|
|
173
|
+
export function pinLine(actionClass, autonomy, provenance) {
|
|
174
|
+
return ` { actionClass: ${JSON.stringify(actionClass)}, autonomy: ${JSON.stringify(autonomy)}, provenance: ${JSON.stringify(provenance)} },`;
|
|
175
|
+
}
|
|
176
|
+
/** One line per failure, in the shape a terminal and a `--json` array share. */
|
|
177
|
+
export function describeFailure(failure) {
|
|
178
|
+
return `${failure.actionClass}: expected ${failure.expected}, got ${failure.actual}${failure.note === undefined ? "" : ` (${failure.note})`}`;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Check a loaded policy against its pins.
|
|
182
|
+
*
|
|
183
|
+
* Three ways to fail. A pinned class that no longer resolves as pinned is the
|
|
184
|
+
* one the list exists for: the pins name only classes whose loosening is a
|
|
185
|
+
* regression (APRV-296), so a failure here is a policy that moved one of them.
|
|
186
|
+
* A pinned resolution the irreversibility floor decided is a pin that stopped
|
|
187
|
+
* measuring the rule. And a class the command classifier cannot emit is a
|
|
188
|
+
* policy line that will never fire.
|
|
189
|
+
*
|
|
190
|
+
* What is NOT a failure, since APRV-296: a class the policy declares and this
|
|
191
|
+
* list does not pin. The pins are a safety floor rather than an inventory, and
|
|
192
|
+
* a policy declaring a new `supervised` or `autonomous` class needs no code
|
|
193
|
+
* change to be accepted. The resolution still prints in the ceremony's semantic
|
|
194
|
+
* diff, where a human reads it before attesting.
|
|
195
|
+
*/
|
|
196
|
+
export function checkPolicyExpectations(load, expectations) {
|
|
197
|
+
const failures = [];
|
|
198
|
+
if (!load.ok) {
|
|
199
|
+
return {
|
|
200
|
+
ok: false,
|
|
201
|
+
failures: [
|
|
202
|
+
{
|
|
203
|
+
kind: "resolution",
|
|
204
|
+
actionClass: "(the file)",
|
|
205
|
+
expected: "a policy that parses",
|
|
206
|
+
actual: `${load.code}: ${load.message}`,
|
|
207
|
+
},
|
|
208
|
+
],
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
for (const expectation of expectations) {
|
|
212
|
+
const resolution = resolve(load, expectation.actionClass);
|
|
213
|
+
const expected = `${expectation.autonomy}/${expectation.provenance}`;
|
|
214
|
+
const actual = `${resolution.autonomy}/${resolution.provenance}`;
|
|
215
|
+
if (actual !== expected) {
|
|
216
|
+
failures.push({
|
|
217
|
+
kind: "resolution",
|
|
218
|
+
actionClass: expectation.actionClass,
|
|
219
|
+
expected,
|
|
220
|
+
actual,
|
|
221
|
+
...(expectation.note === undefined ? {} : { note: expectation.note }),
|
|
222
|
+
});
|
|
223
|
+
continue;
|
|
224
|
+
}
|
|
225
|
+
if (resolution.floorApplied) {
|
|
226
|
+
failures.push({
|
|
227
|
+
kind: "floor",
|
|
228
|
+
actionClass: expectation.actionClass,
|
|
229
|
+
expected: "no irreversibility floor on the default path",
|
|
230
|
+
actual: "the floor decided this resolution",
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
const declared = Object.keys(load.policy.classes ?? {}).filter((pattern) => !pattern.includes("*"));
|
|
235
|
+
for (const actionClass of declared) {
|
|
236
|
+
// APRV-266: reachability is asked WITH the policy's own `protected_paths`,
|
|
237
|
+
// because a `policy.edit` sub-class is emitted only where an entry routes a
|
|
238
|
+
// path family to it. The question is the one this check always asked —
|
|
239
|
+
// would this line ever fire? — and a routed class nothing routes to still
|
|
240
|
+
// answers no, which is the case worth catching: a `policy.edit.ci` rule
|
|
241
|
+
// whose routing was deleted looks like protection and is not.
|
|
242
|
+
if (!emittableClass(actionClass, load.policy.protected_paths ?? [])) {
|
|
243
|
+
failures.push({
|
|
244
|
+
kind: "unreachable",
|
|
245
|
+
actionClass,
|
|
246
|
+
expected: "a class the command classifier can emit",
|
|
247
|
+
actual: "no rule in src/core/command-class.ts emits it and no protected_paths entry routes to it, so the policy line would never fire",
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
return { ok: failures.length === 0, failures };
|
|
252
|
+
}
|
|
253
|
+
/** The name of the module a human edits when a pin has to move. */
|
|
254
|
+
export const EXPECTATIONS_MODULE = "src/core/policy-expectations.ts";
|
|
255
|
+
/**
|
|
256
|
+
* The dogfood suite, in source and as the build output that actually runs
|
|
257
|
+
* (APRV-274). Repo-relative, so a caller joins them onto the repository root.
|
|
258
|
+
*
|
|
259
|
+
* Both spellings are needed and they answer different questions. The SOURCE
|
|
260
|
+
* says whether this repository has a dogfood suite at all, which is what keeps
|
|
261
|
+
* the ceremony inert in somebody else's checkout. The BUILT file is what a
|
|
262
|
+
* ceremony runs, and its absence beside a present source is a stale build: the
|
|
263
|
+
* pins the suite would read are the ones in `dist/`, so a ceremony that ran the
|
|
264
|
+
* suite there would be checking the previous edit's pins.
|
|
265
|
+
*/
|
|
266
|
+
export const DOGFOOD_SUITE_SOURCE = "tests/dogfood.test.ts";
|
|
267
|
+
export const DOGFOOD_SUITE_BUILT = "dist/tests/dogfood.test.js";
|
|
268
|
+
/**
|
|
269
|
+
* The body of `const <constant> … = [ … ];` in `text`, or the whole text when
|
|
270
|
+
* no such declaration is there.
|
|
271
|
+
*
|
|
272
|
+
* The scope is what keeps the reader honest about which `actionClass` mentions
|
|
273
|
+
* are pins. The fallback is deliberately permissive rather than empty: this is
|
|
274
|
+
* a display reader over somebody's edited file, and a version whose declaration
|
|
275
|
+
* it cannot find is better reported approximately than reported as no pins at
|
|
276
|
+
* all. A `constant` that is not a plain identifier is refused outright rather
|
|
277
|
+
* than interpolated into a pattern.
|
|
278
|
+
*/
|
|
279
|
+
function pinsArrayOf(text, constant) {
|
|
280
|
+
if (!/^[A-Za-z_$][\w$]*$/u.test(constant))
|
|
281
|
+
return text;
|
|
282
|
+
// `const <name>` and not a bare mention: the name appears in prose above the
|
|
283
|
+
// declaration, and a match there would scope the read to a doc comment. The
|
|
284
|
+
// type annotation between the name and the `=` may itself carry brackets
|
|
285
|
+
// (`readonly PolicyExpectation[]`), so only the newline bounds the middle.
|
|
286
|
+
const declared = new RegExp(`\\bconst\\s+${constant}\\b[^=\\n]*=\\s*\\[`, "u").exec(text);
|
|
287
|
+
if (declared === null)
|
|
288
|
+
return text;
|
|
289
|
+
const from = declared.index + declared[0].length;
|
|
290
|
+
const end = text.indexOf("\n];", from);
|
|
291
|
+
return end < 0 ? text.slice(from) : text.slice(from, end);
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* The pins a version of the module TEXT declares (APRV-274).
|
|
295
|
+
*
|
|
296
|
+
* A DISPLAY reader and nothing else. It exists so the amendment ceremony can
|
|
297
|
+
* show what the pins file did between the commit it is built on and the working
|
|
298
|
+
* tree, and the committed side of that comparison is a git blob: TypeScript
|
|
299
|
+
* source, with no build output to import. Nothing here gates anything. The pin
|
|
300
|
+
* check that can refuse a ceremony resolves the COMPILED
|
|
301
|
+
* {@link REPO_POLICY_EXPECTATIONS} against a loaded policy, exactly as it did
|
|
302
|
+
* before this function existed, so a text this reader misreads costs a report
|
|
303
|
+
* line and never a wrong verdict.
|
|
304
|
+
*
|
|
305
|
+
* The read is lexical and SCOPED to the named array literal, which matters:
|
|
306
|
+
* this very module mentions `actionClass` outside the pins (in the failure it
|
|
307
|
+
* builds for a policy that does not parse), and a reader that swept the whole
|
|
308
|
+
* file would report that mention as a pin. Inside the array, entries are split
|
|
309
|
+
* on `actionClass:`, and within one entry the first `autonomy:` and
|
|
310
|
+
* `provenance:` string literals are its resolution. That holds for a list
|
|
311
|
+
* written in the shape this module's own list is written in, where both fields
|
|
312
|
+
* precede the free-text `note`. An entry it cannot read is reported with a
|
|
313
|
+
* `null` resolution rather than dropped, so a pin that moved is never silently
|
|
314
|
+
* absent from the report.
|
|
315
|
+
*/
|
|
316
|
+
export function readPinSource(text, constant = "REPO_POLICY_EXPECTATIONS") {
|
|
317
|
+
const entries = [];
|
|
318
|
+
const scoped = pinsArrayOf(text, constant);
|
|
319
|
+
const boundaries = [...scoped.matchAll(/\bactionClass\s*:\s*"([^"]*)"/gu)];
|
|
320
|
+
for (const [index, boundary] of boundaries.entries()) {
|
|
321
|
+
const actionClass = boundary[1];
|
|
322
|
+
if (actionClass === undefined || actionClass.length === 0)
|
|
323
|
+
continue;
|
|
324
|
+
const from = (boundary.index ?? 0) + boundary[0].length;
|
|
325
|
+
const to = boundaries[index + 1]?.index ?? scoped.length;
|
|
326
|
+
const body = scoped.slice(from, to);
|
|
327
|
+
const autonomy = /\bautonomy\s*:\s*"([^"]*)"/u.exec(body)?.[1];
|
|
328
|
+
const provenance = /\bprovenance\s*:\s*"([^"]*)"/u.exec(body)?.[1];
|
|
329
|
+
entries.push({
|
|
330
|
+
actionClass,
|
|
331
|
+
resolution: autonomy === undefined || provenance === undefined ? null : `${autonomy}/${provenance}`,
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
return entries;
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* How the pins moved from one version of the module text to another, sorted by
|
|
338
|
+
* class so two runs of the same ceremony print the same report.
|
|
339
|
+
*
|
|
340
|
+
* A class pinned twice in one version keeps the FIRST reading, which is what
|
|
341
|
+
* the compiled list resolves to as well: {@link checkPolicyExpectations} walks
|
|
342
|
+
* the array in order and a duplicate cannot change an earlier entry's verdict.
|
|
343
|
+
*/
|
|
344
|
+
export function diffPinSources(before, after) {
|
|
345
|
+
const read = (text) => {
|
|
346
|
+
const map = new Map();
|
|
347
|
+
for (const entry of readPinSource(text)) {
|
|
348
|
+
if (!map.has(entry.actionClass))
|
|
349
|
+
map.set(entry.actionClass, entry.resolution ?? "unreadable");
|
|
350
|
+
}
|
|
351
|
+
return map;
|
|
352
|
+
};
|
|
353
|
+
const from = read(before);
|
|
354
|
+
const to = read(after);
|
|
355
|
+
const changes = [];
|
|
356
|
+
for (const actionClass of [...new Set([...from.keys(), ...to.keys()])].sort()) {
|
|
357
|
+
const was = from.get(actionClass) ?? null;
|
|
358
|
+
const now = to.get(actionClass) ?? null;
|
|
359
|
+
if (was === now)
|
|
360
|
+
continue;
|
|
361
|
+
changes.push({ actionClass, before: was, after: now });
|
|
362
|
+
}
|
|
363
|
+
return changes;
|
|
364
|
+
}
|
|
365
|
+
/** One pin change on one line, for a terminal and for a `--json` array. */
|
|
366
|
+
export function describePinChange(change) {
|
|
367
|
+
return `${change.actionClass}: ${change.before ?? "not pinned"} -> ${change.after ?? "not pinned"}`;
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* The pins that govern `policyPath`, or `null` when none do.
|
|
371
|
+
*
|
|
372
|
+
* The test is package identity and nothing looser: the nearest `package.json`
|
|
373
|
+
* above the policy file names `approval-md`. A copy of the policy carried into
|
|
374
|
+
* some other repository is not this repository's policy, and a user's own
|
|
375
|
+
* `APPROVAL.md` is nobody's business but theirs.
|
|
376
|
+
*/
|
|
377
|
+
export function expectationsFor(policyPath) {
|
|
378
|
+
let at = dirname(policyPath);
|
|
379
|
+
for (let depth = 0; depth < 16; depth += 1) {
|
|
380
|
+
try {
|
|
381
|
+
const raw = readFileSync(join(at, "package.json"), "utf8");
|
|
382
|
+
const parsed = JSON.parse(raw);
|
|
383
|
+
return parsed.name === "approval-md" ? REPO_POLICY_EXPECTATIONS : null;
|
|
384
|
+
}
|
|
385
|
+
catch {
|
|
386
|
+
const up = dirname(at);
|
|
387
|
+
if (up === at)
|
|
388
|
+
return null;
|
|
389
|
+
at = up;
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
return null;
|
|
393
|
+
}
|
|
394
|
+
//# sourceMappingURL=policy-expectations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy-expectations.js","sourceRoot":"","sources":["../../../src/core/policy-expectations.ts"],"names":[],"mappings":"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"}
|