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,536 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Policy loading: find `APPROVAL.md`, extract its single
|
|
3
|
+
* ` ```yaml approval-policy ` fenced block, parse it, validate it, and resolve
|
|
4
|
+
* its duration strings to milliseconds.
|
|
5
|
+
*
|
|
6
|
+
* SPEC.md §5: the policy file is "prose for humans plus exactly one fenced
|
|
7
|
+
* block for machines". Implementations MUST parse the fenced block, MUST
|
|
8
|
+
* ignore surrounding prose, and MUST accept `APPROVALS.md` as a fallback
|
|
9
|
+
* filename with `APPROVAL.md` winning when both exist.
|
|
10
|
+
*
|
|
11
|
+
* ## Fail-closed contract (SPEC.md §5.2)
|
|
12
|
+
*
|
|
13
|
+
* Every failure mode of this module returns `{ ok: false, code, message }` —
|
|
14
|
+
* nothing throws, and nothing returns a partially-understood policy. A not-ok
|
|
15
|
+
* result places a hard obligation on the consumer (the APRV-11 class matcher
|
|
16
|
+
* and everything downstream of it): **treat every class as `manual`.** There
|
|
17
|
+
* is no "load what we could" path, because a policy the runtime only half
|
|
18
|
+
* understood is a policy whose author believes constraints are in force that
|
|
19
|
+
* are not. A missing file is not permission to run unattended; it is the
|
|
20
|
+
* absence of any grant, which is `manual` for everything.
|
|
21
|
+
*
|
|
22
|
+
* ## YAML version stance
|
|
23
|
+
*
|
|
24
|
+
* The `yaml` package parses **YAML 1.2** by default and this module keeps that
|
|
25
|
+
* default, additionally pinning `schema: "core"` — the YAML 1.2 core schema.
|
|
26
|
+
* Consequences that matter for a policy file:
|
|
27
|
+
*
|
|
28
|
+
* - YAML 1.1-isms are **not** honored. `yes`, `no`, `on`, `off`, `y`, `n` parse
|
|
29
|
+
* as the plain strings `"yes"`, `"no"`, … and **not** as booleans; sexagesimal
|
|
30
|
+
* (`1:30`) is a string, not a number. This is deliberate. A policy file is a
|
|
31
|
+
* permission document: the difference between the string `"no"` and the
|
|
32
|
+
* boolean `false` must never depend on which YAML dialect an implementation
|
|
33
|
+
* happens to ship. Under YAML 1.2 core, only `true`/`false` are booleans, so
|
|
34
|
+
* a policy that writes `autonomy: no` yields the string `"no"`, fails the
|
|
35
|
+
* closed `autonomy` enum in `policy.schema.json`, and the whole policy fails
|
|
36
|
+
* closed to all-`manual` — a loud rejection instead of a silent coercion.
|
|
37
|
+
* - No custom or implicit-typed tags are accepted. Any node carrying an
|
|
38
|
+
* explicit tag (`!!timestamp`, `!!binary`, `!Anything`) is rejected as
|
|
39
|
+
* `yaml-error`, so a policy value can only ever be a string, number, boolean,
|
|
40
|
+
* null, map, or sequence. Tag-driven type coercion (and any tag-driven
|
|
41
|
+
* construction in a future `yaml` release) can therefore never reach the
|
|
42
|
+
* schema validator.
|
|
43
|
+
* - Anchors and aliases are permitted but bounded: {@link MAX_ALIAS_COUNT}
|
|
44
|
+
* caps alias expansion so a billion-laughs document fails closed as
|
|
45
|
+
* `yaml-error` instead of exhausting memory.
|
|
46
|
+
* - Duplicate mapping keys are parse errors (the `yaml` default), not
|
|
47
|
+
* last-one-wins.
|
|
48
|
+
*
|
|
49
|
+
* Any parser error **or warning** fails the load closed. Warnings in `yaml`
|
|
50
|
+
* flag constructs the parser recovered from (unsupported directives, deprecated
|
|
51
|
+
* syntax); "recovered from" is exactly the silent reinterpretation a policy
|
|
52
|
+
* file must not tolerate.
|
|
53
|
+
*
|
|
54
|
+
* ## Determinism
|
|
55
|
+
*
|
|
56
|
+
* `loadPolicy` is a pure function of the file bytes on disk plus the schema
|
|
57
|
+
* directory. No clock, no network, no randomness, no cross-call caching.
|
|
58
|
+
*/
|
|
59
|
+
import { readFileSync } from "node:fs";
|
|
60
|
+
import { basename, join } from "node:path";
|
|
61
|
+
import { isNode, parseDocument, visit } from "yaml";
|
|
62
|
+
import { builtinProtectedPathClass, parseProtectedEntry, } from "./command-class.js";
|
|
63
|
+
import { scanFences } from "./md-fence.js";
|
|
64
|
+
// The routing floor (APRV-266) needs the resolver's own strictness table and
|
|
65
|
+
// its own resolution of two classes, so this module imports the matcher that
|
|
66
|
+
// imports this module's TYPES. The cycle is type-only in the other direction
|
|
67
|
+
// and erased at build, so nothing circular exists at runtime — and the
|
|
68
|
+
// alternative, a private strictness table here, is exactly the drift a floor
|
|
69
|
+
// must never have from the resolution it floors.
|
|
70
|
+
import { resolve, STRICTNESS } from "./policy-match.js";
|
|
71
|
+
import { promptBlockErrors } from "./prompt-layout.js";
|
|
72
|
+
import { validate } from "./validate.js";
|
|
73
|
+
/**
|
|
74
|
+
* Upper bound on alias expansions in one policy document.
|
|
75
|
+
*
|
|
76
|
+
* Anchors are legitimate in a hand-written policy (sharing an approver list
|
|
77
|
+
* across a few class rules), so aliases are not banned outright — but alias
|
|
78
|
+
* expansion is exponential in the number of nesting levels, which is the
|
|
79
|
+
* "billion laughs" resource-exhaustion attack. 32 is far above what any
|
|
80
|
+
* plausible hand-written APPROVAL.md needs and far below anything that costs
|
|
81
|
+
* measurable memory. Exceeding it is a hard `yaml-error`.
|
|
82
|
+
*/
|
|
83
|
+
export const MAX_ALIAS_COUNT = 32;
|
|
84
|
+
/** Info string that marks the machine-readable policy block (SPEC.md §5). */
|
|
85
|
+
export const POLICY_INFO_STRING = "yaml approval-policy";
|
|
86
|
+
/** Policy filenames, in precedence order (SPEC.md §5). */
|
|
87
|
+
export const POLICY_FILENAMES = ["APPROVAL.md", "APPROVALS.md"];
|
|
88
|
+
/** Duration grammar from SPEC.md §5.2: `<positive integer><unit>`. */
|
|
89
|
+
const DURATION_PATTERN = /^([1-9][0-9]*)(ms|s|m|h|d|w)$/;
|
|
90
|
+
const MS_PER_UNIT = {
|
|
91
|
+
ms: 1,
|
|
92
|
+
s: 1_000,
|
|
93
|
+
m: 60_000,
|
|
94
|
+
h: 3_600_000,
|
|
95
|
+
d: 86_400_000,
|
|
96
|
+
w: 604_800_000,
|
|
97
|
+
};
|
|
98
|
+
/** The delivery mode in force. Fail-closed: anything unusable is `manual`. */
|
|
99
|
+
export function tokenDeliveryOf(load) {
|
|
100
|
+
if (!load.ok)
|
|
101
|
+
return "manual";
|
|
102
|
+
return load.policy.defaults?.token_delivery === "sealed" ? "sealed" : "manual";
|
|
103
|
+
}
|
|
104
|
+
/** The defaults a policy that declares no `daemon` block is read under. */
|
|
105
|
+
export const DEFAULT_POLICY_DAEMON_READ = Object.freeze({
|
|
106
|
+
readProof: "full",
|
|
107
|
+
fullReproofEvery: 50,
|
|
108
|
+
fullReproofAfterMs: 60_000,
|
|
109
|
+
declared: false,
|
|
110
|
+
});
|
|
111
|
+
/**
|
|
112
|
+
* Parse a SPEC.md §5.2 duration string to milliseconds.
|
|
113
|
+
*
|
|
114
|
+
* Accepts exactly `<positive integer><unit>` with unit in `ms|s|m|h|d|w`
|
|
115
|
+
* (`w` = 7 days). Returns `null` for **any** deviation: zero, leading zeros,
|
|
116
|
+
* negatives, fractions, compound forms (`1h30m`), surrounding whitespace,
|
|
117
|
+
* empty input, unknown units. Deterministic and total — never throws.
|
|
118
|
+
*/
|
|
119
|
+
export function parseDuration(text) {
|
|
120
|
+
if (typeof text !== "string")
|
|
121
|
+
return null;
|
|
122
|
+
const match = DURATION_PATTERN.exec(text);
|
|
123
|
+
if (match === null)
|
|
124
|
+
return null;
|
|
125
|
+
const digits = match[1];
|
|
126
|
+
const unit = match[2];
|
|
127
|
+
if (digits === undefined || unit === undefined)
|
|
128
|
+
return null;
|
|
129
|
+
const scale = MS_PER_UNIT[unit];
|
|
130
|
+
if (scale === undefined)
|
|
131
|
+
return null;
|
|
132
|
+
const value = Number(digits);
|
|
133
|
+
if (!Number.isSafeInteger(value))
|
|
134
|
+
return null;
|
|
135
|
+
return value * scale;
|
|
136
|
+
}
|
|
137
|
+
function failure(code, message, errors, raw) {
|
|
138
|
+
const base = errors === undefined
|
|
139
|
+
? { ok: false, code, message }
|
|
140
|
+
: { ok: false, code, message, errors };
|
|
141
|
+
return raw === undefined ? base : { ...base, ok: false, code, message, raw };
|
|
142
|
+
}
|
|
143
|
+
function errorMessage(cause) {
|
|
144
|
+
return cause instanceof Error ? cause.message : String(cause);
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Scan this file's markdown for policy fences.
|
|
148
|
+
*
|
|
149
|
+
* A one-line wrapper since APRV-238. The CommonMark rules, and the doc comment
|
|
150
|
+
* arguing them, moved to {@link scanFences} in `core/md-fence.ts` so the values
|
|
151
|
+
* reader of SPEC.md §5.3 could ask the same question about its own info string
|
|
152
|
+
* without importing this module. Same rules, same results, one implementation.
|
|
153
|
+
*/
|
|
154
|
+
function scanPolicyFences(markdown) {
|
|
155
|
+
return scanFences(markdown, POLICY_INFO_STRING);
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Parse YAML under the hardened settings described in the module header:
|
|
159
|
+
* YAML 1.2 core schema, warnings fatal, duplicate keys fatal, explicitly tagged
|
|
160
|
+
* nodes rejected, alias expansion bounded by {@link MAX_ALIAS_COUNT}.
|
|
161
|
+
*
|
|
162
|
+
* **This is the one implementation.** `core/frontmatter.ts` parses the *other*
|
|
163
|
+
* half of the same permission surface — the task envelope declares the class,
|
|
164
|
+
* cost, and reversibility that policy is matched against — and used to carry a
|
|
165
|
+
* replica of these settings. APRV-20 (finding S5) deleted the replica: a task
|
|
166
|
+
* envelope and a policy block are now hardened by the same code, so the two
|
|
167
|
+
* cannot drift apart, and a hardening fix lands in both at once.
|
|
168
|
+
*
|
|
169
|
+
* Never throws; every failure is a message. Pure function of the source text.
|
|
170
|
+
*/
|
|
171
|
+
export function parseHardenedYaml(source, labels) {
|
|
172
|
+
const { subject, tagContext } = labels;
|
|
173
|
+
let document;
|
|
174
|
+
try {
|
|
175
|
+
document = parseDocument(source, {
|
|
176
|
+
schema: "core",
|
|
177
|
+
logLevel: "silent",
|
|
178
|
+
prettyErrors: false,
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
catch (cause) {
|
|
182
|
+
return { ok: false, message: `${subject} could not be parsed: ${errorMessage(cause)}` };
|
|
183
|
+
}
|
|
184
|
+
if (document.errors.length > 0) {
|
|
185
|
+
return {
|
|
186
|
+
ok: false,
|
|
187
|
+
message: `${subject} could not be parsed: ${document.errors
|
|
188
|
+
.map((error) => error.message)
|
|
189
|
+
.join("; ")}`,
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
if (document.warnings.length > 0) {
|
|
193
|
+
return {
|
|
194
|
+
ok: false,
|
|
195
|
+
message: `${subject} parsed with warnings, which fail closed: ${document.warnings
|
|
196
|
+
.map((warning) => warning.message)
|
|
197
|
+
.join("; ")}`,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
// Reject explicitly tagged nodes outright: a value must only ever be a plain
|
|
201
|
+
// string, number, boolean, null, map, or sequence.
|
|
202
|
+
let taggedTag = null;
|
|
203
|
+
visit(document, (_key, node) => {
|
|
204
|
+
if (taggedTag === null && isNode(node) && typeof node.tag === "string") {
|
|
205
|
+
taggedTag = node.tag;
|
|
206
|
+
}
|
|
207
|
+
return undefined;
|
|
208
|
+
});
|
|
209
|
+
if (taggedTag !== null) {
|
|
210
|
+
return {
|
|
211
|
+
ok: false,
|
|
212
|
+
message: `${subject} uses an explicit tag (${String(taggedTag)}); tags are not accepted in ${tagContext}`,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
let value;
|
|
216
|
+
try {
|
|
217
|
+
// Alias expansion happens here, so this is where the bound belongs
|
|
218
|
+
// (`maxAliasCount` is a ToJSOptions field): exceeding it throws.
|
|
219
|
+
value = document.toJS({ maxAliasCount: MAX_ALIAS_COUNT });
|
|
220
|
+
}
|
|
221
|
+
catch (cause) {
|
|
222
|
+
return { ok: false, message: `${subject} could not be materialised: ${errorMessage(cause)}` };
|
|
223
|
+
}
|
|
224
|
+
return { ok: true, value };
|
|
225
|
+
}
|
|
226
|
+
/** {@link parseHardenedYaml} with this module's labels and error code. */
|
|
227
|
+
function parsePolicyYaml(source) {
|
|
228
|
+
const parsed = parseHardenedYaml(source, {
|
|
229
|
+
subject: "policy YAML",
|
|
230
|
+
tagContext: "a policy block",
|
|
231
|
+
});
|
|
232
|
+
return parsed.ok ? { value: parsed.value } : failure("yaml-error", parsed.message);
|
|
233
|
+
}
|
|
234
|
+
function resolveFile(options) {
|
|
235
|
+
if (options.file !== undefined) {
|
|
236
|
+
try {
|
|
237
|
+
return { path: options.file, text: readFileSync(options.file, "utf8") };
|
|
238
|
+
}
|
|
239
|
+
catch (cause) {
|
|
240
|
+
return failure("file-missing", `policy file ${options.file} could not be read: ${errorMessage(cause)}`);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
const dir = options.dir ?? process.cwd();
|
|
244
|
+
for (const filename of POLICY_FILENAMES) {
|
|
245
|
+
const candidate = join(dir, filename);
|
|
246
|
+
try {
|
|
247
|
+
return { path: candidate, text: readFileSync(candidate, "utf8") };
|
|
248
|
+
}
|
|
249
|
+
catch {
|
|
250
|
+
continue;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
return failure("file-missing", `no policy file found in ${dir} (looked for ${POLICY_FILENAMES.join(", ")})`);
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* The fail-closed result for policy bytes that could not be read at all.
|
|
257
|
+
*
|
|
258
|
+
* Exported for callers that read the file themselves and still need a
|
|
259
|
+
* {@link PolicyLoadResult} to hand `resolve` (APRV-142): a caller must never
|
|
260
|
+
* have to invent one, because an invented result is where a permissive default
|
|
261
|
+
* would creep in. `file-missing` is the same code {@link loadPolicy} reports
|
|
262
|
+
* for the same fact.
|
|
263
|
+
*/
|
|
264
|
+
export function policyUnreadable(path, cause) {
|
|
265
|
+
return failure("file-missing", `policy file ${path} could not be read: ${cause}`);
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Extract, parse, and validate the policy block of an already-read policy file.
|
|
269
|
+
*
|
|
270
|
+
* The bytes-in form of {@link loadPolicy}, split out for APRV-142: a gate
|
|
271
|
+
* operation reads `APPROVAL.md` **once** and feeds the same buffer to both the
|
|
272
|
+
* attestation hash check and this parse, so no mid-operation file swap can
|
|
273
|
+
* attest one policy and enforce another. `path` is used for messages and for
|
|
274
|
+
* {@link PolicySource}; nothing here touches the filesystem.
|
|
275
|
+
*
|
|
276
|
+
* Fails closed on every error path and never throws, exactly as
|
|
277
|
+
* {@link loadPolicy} does — it is the same code.
|
|
278
|
+
*/
|
|
279
|
+
export function loadPolicyText(path, text, options = {}) {
|
|
280
|
+
const resolved = { path, text };
|
|
281
|
+
const scan = scanPolicyFences(resolved.text);
|
|
282
|
+
if (scan.unterminated) {
|
|
283
|
+
// CommonMark would close an unterminated fence at EOF; a policy file must
|
|
284
|
+
// not be that forgiving, because the truncated tail of a policy is
|
|
285
|
+
// indistinguishable from a complete one.
|
|
286
|
+
return failure("no-block", `${resolved.path}: unterminated \`\`\`${POLICY_INFO_STRING} fence (no closing fence before end of file)`);
|
|
287
|
+
}
|
|
288
|
+
if (scan.blocks.length === 0) {
|
|
289
|
+
return failure("no-block", `${resolved.path}: no \`\`\`${POLICY_INFO_STRING} fenced block found`);
|
|
290
|
+
}
|
|
291
|
+
if (scan.blocks.length > 1) {
|
|
292
|
+
return failure("multiple-blocks", `${resolved.path}: found ${scan.blocks.length} \`\`\`${POLICY_INFO_STRING} fenced blocks; SPEC.md §5 allows exactly one`);
|
|
293
|
+
}
|
|
294
|
+
const parsed = parsePolicyYaml(scan.blocks[0] ?? "");
|
|
295
|
+
if ("ok" in parsed)
|
|
296
|
+
return parsed;
|
|
297
|
+
const validation = validate("policy", parsed.value, options.schemaDir === undefined ? {} : { schemaDir: options.schemaDir });
|
|
298
|
+
if (!validation.ok) {
|
|
299
|
+
return failure("schema-invalid", `${resolved.path}: policy block failed schema validation`, validation.errors, parsed.value);
|
|
300
|
+
}
|
|
301
|
+
const policy = parsed.value;
|
|
302
|
+
// `channels.<name>.prompt` (APRV-218), checked once here for every channel
|
|
303
|
+
// name including the untyped ones the schema admits as free-form objects.
|
|
304
|
+
// Same fail direction as every other semantic check on this path: the WHOLE
|
|
305
|
+
// policy fails closed to all-`manual` rather than one channel quietly
|
|
306
|
+
// rendering a layout its author did not write. See `core/prompt-layout.ts`
|
|
307
|
+
// for why both nets exist.
|
|
308
|
+
const promptErrors = promptBlockErrors(policy);
|
|
309
|
+
if (promptErrors.length > 0) {
|
|
310
|
+
return failure("schema-invalid", `${resolved.path}: channel prompt layout is not usable`, promptErrors, parsed.value);
|
|
311
|
+
}
|
|
312
|
+
const ttlText = policy.defaults?.approval_ttl;
|
|
313
|
+
let approvalTtlMs = null;
|
|
314
|
+
if (ttlText !== undefined) {
|
|
315
|
+
approvalTtlMs = parseDuration(ttlText);
|
|
316
|
+
if (approvalTtlMs === null) {
|
|
317
|
+
// Unreachable while the schema's duration pattern and the grammar here
|
|
318
|
+
// agree; kept as a fail-closed backstop rather than an assertion.
|
|
319
|
+
return failure("schema-invalid", `${resolved.path}: defaults.approval_ttl "${ttlText}" is not a valid duration`, [
|
|
320
|
+
{
|
|
321
|
+
path: "/defaults/approval_ttl",
|
|
322
|
+
keyword: "duration",
|
|
323
|
+
message: "expected <positive integer><unit> with unit in ms|s|m|h|d|w",
|
|
324
|
+
},
|
|
325
|
+
], parsed.value);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
// The same treatment, for the same reason: one parse of the grammar, one
|
|
329
|
+
// number every reader shares, and an unparseable duration fails the whole
|
|
330
|
+
// policy rather than leaving one key quietly unread (APRV-58).
|
|
331
|
+
const skewText = policy.audit?.skew_tolerance;
|
|
332
|
+
let skewToleranceMs = null;
|
|
333
|
+
if (skewText !== undefined) {
|
|
334
|
+
skewToleranceMs = parseDuration(skewText);
|
|
335
|
+
if (skewToleranceMs === null) {
|
|
336
|
+
return failure("schema-invalid", `${resolved.path}: audit.skew_tolerance "${skewText}" is not a valid duration`, [
|
|
337
|
+
{
|
|
338
|
+
path: "/audit/skew_tolerance",
|
|
339
|
+
keyword: "duration",
|
|
340
|
+
message: "expected <positive integer><unit> with unit in ms|s|m|h|d|w",
|
|
341
|
+
},
|
|
342
|
+
], parsed.value);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
// And once more for the checkpoint cadence (APRV-220). Report-only like the
|
|
346
|
+
// skew tolerance, and parsed the same strict way for the same reason: an
|
|
347
|
+
// operator who wrote `1 day` should be told, not quietly given no cadence at
|
|
348
|
+
// all and left believing one is in force.
|
|
349
|
+
const checkpointText = policy.audit?.checkpoint_every;
|
|
350
|
+
let checkpointEveryMs = null;
|
|
351
|
+
if (checkpointText !== undefined) {
|
|
352
|
+
checkpointEveryMs = parseDuration(checkpointText);
|
|
353
|
+
if (checkpointEveryMs === null) {
|
|
354
|
+
return failure("schema-invalid", `${resolved.path}: audit.checkpoint_every "${checkpointText}" is not a valid duration`, [
|
|
355
|
+
{
|
|
356
|
+
path: "/audit/checkpoint_every",
|
|
357
|
+
keyword: "duration",
|
|
358
|
+
message: "expected <positive integer><unit> with unit in ms|s|m|h|d|w",
|
|
359
|
+
},
|
|
360
|
+
], parsed.value);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
// The `daemon` block (APRV-217), read the same way: one parse here, defaults
|
|
364
|
+
// applied once, and an unparseable duration fails the WHOLE policy rather
|
|
365
|
+
// than leaving a key the author believed was in force quietly unread.
|
|
366
|
+
const reproofText = policy.daemon?.full_reproof_after;
|
|
367
|
+
let fullReproofAfterMs = DEFAULT_POLICY_DAEMON_READ.fullReproofAfterMs;
|
|
368
|
+
if (reproofText !== undefined) {
|
|
369
|
+
const parsedMs = parseDuration(reproofText);
|
|
370
|
+
if (parsedMs === null) {
|
|
371
|
+
return failure("schema-invalid", `${resolved.path}: daemon.full_reproof_after "${reproofText}" is not a valid duration`, [
|
|
372
|
+
{
|
|
373
|
+
path: "/daemon/full_reproof_after",
|
|
374
|
+
keyword: "duration",
|
|
375
|
+
message: "expected <positive integer><unit> with unit in ms|s|m|h|d|w",
|
|
376
|
+
},
|
|
377
|
+
], parsed.value);
|
|
378
|
+
}
|
|
379
|
+
fullReproofAfterMs = parsedMs;
|
|
380
|
+
}
|
|
381
|
+
const daemonRead = {
|
|
382
|
+
readProof: policy.daemon?.read_proof ?? DEFAULT_POLICY_DAEMON_READ.readProof,
|
|
383
|
+
fullReproofEvery: policy.daemon?.full_reproof_every ?? DEFAULT_POLICY_DAEMON_READ.fullReproofEvery,
|
|
384
|
+
fullReproofAfterMs,
|
|
385
|
+
declared: policy.daemon !== undefined,
|
|
386
|
+
};
|
|
387
|
+
const loaded = {
|
|
388
|
+
ok: true,
|
|
389
|
+
policy,
|
|
390
|
+
source: { path: resolved.path, filename: basename(resolved.path) },
|
|
391
|
+
durations: { approvalTtlMs, skewToleranceMs, checkpointEveryMs },
|
|
392
|
+
daemon: daemonRead,
|
|
393
|
+
notes: aliasNotes(policy),
|
|
394
|
+
};
|
|
395
|
+
// APRV-266: the routing floor is the LAST gate on a load, because it is the
|
|
396
|
+
// only check here that needs the resolved policy rather than the parsed one.
|
|
397
|
+
const floor = checkProtectedRouteFloor(loaded);
|
|
398
|
+
if (floor !== null) {
|
|
399
|
+
return failure("protected-route-floor", `${resolved.path}: ${floor}`, undefined, parsed.value);
|
|
400
|
+
}
|
|
401
|
+
return loaded;
|
|
402
|
+
}
|
|
403
|
+
/**
|
|
404
|
+
* The routing floor (amended SPEC.md §5.2, APRV-266): a `protected_paths`
|
|
405
|
+
* routing may make a BUILT-IN protected path stricter and never weaker.
|
|
406
|
+
*
|
|
407
|
+
* `protected_paths` has been additive-only since APRV-107 for a reason that
|
|
408
|
+
* routing does not repeal: a policy that could shrink its own protected surface
|
|
409
|
+
* is a policy an agent can edit its way out of. Routing is a new way to try —
|
|
410
|
+
* `{path: CLAUDE.md, class: policy.edit.docs}` with `policy.edit.docs:
|
|
411
|
+
* autonomous` would take the agent instruction files out of the gate without
|
|
412
|
+
* removing a single path from any list, and every surface downstream would
|
|
413
|
+
* report the policy as widened.
|
|
414
|
+
*
|
|
415
|
+
* So: for each entry that routes a path the runtime protects on its own, the
|
|
416
|
+
* sub-class must resolve at least as strictly as the `policy.edit` line does.
|
|
417
|
+
* Strictness is `policy-match.ts`'s own table, so the floor and the resolver
|
|
418
|
+
* cannot come to different conclusions about which of two levels is stricter,
|
|
419
|
+
* and a tie on the level compares the live RATE: `supervised-live 0.01` under a
|
|
420
|
+
* `policy.edit` of `supervised-live 0.1` gates one tenth as often as the line it
|
|
421
|
+
* replaces, which is a weakening whatever the level says.
|
|
422
|
+
*
|
|
423
|
+
* A route aimed at a `policy.core` or `log.mutate` path is refused outright
|
|
424
|
+
* rather than allowed to sit inert. It never fires — `protectedPathClass` tier 2
|
|
425
|
+
* answers before the routed tier, which is §11.1 invariant 9 holding — but an
|
|
426
|
+
* author reading their own file would believe a rule is in force that the
|
|
427
|
+
* runtime will never consult, and a policy nobody can read correctly is the
|
|
428
|
+
* failure this project exists to prevent.
|
|
429
|
+
*
|
|
430
|
+
* The consequence of a failure is that the policy does not load AT ALL, and a
|
|
431
|
+
* policy that does not load resolves every class to `manual`. That is the
|
|
432
|
+
* strictest available answer and the one this file has always given: an author
|
|
433
|
+
* who wrote a weakening they did not intend gets everything gated, plus a
|
|
434
|
+
* message naming the entry, rather than the weakening.
|
|
435
|
+
*
|
|
436
|
+
* `null` when the policy is clear; otherwise the message.
|
|
437
|
+
*/
|
|
438
|
+
export function checkProtectedRouteFloor(load) {
|
|
439
|
+
if (!load.ok)
|
|
440
|
+
return null;
|
|
441
|
+
const entries = load.policy.protected_paths ?? [];
|
|
442
|
+
if (!entries.some((entry) => typeof entry !== "string"))
|
|
443
|
+
return null;
|
|
444
|
+
const line = resolve(load, "policy.edit");
|
|
445
|
+
for (const entry of entries) {
|
|
446
|
+
if (typeof entry === "string")
|
|
447
|
+
continue;
|
|
448
|
+
const parsedEntry = parseProtectedEntry(entry);
|
|
449
|
+
if (parsedEntry === null || parsedEntry.routed === null) {
|
|
450
|
+
return `protected_paths entry ${JSON.stringify(entry.path)} routes to ${JSON.stringify(entry.class)}, which is not a \`policy.edit\` sub-class. A policy may name its own sub-classes under \`policy.edit\` and nothing else: the gate's own organs and the record of what happened are the runtime's to classify (SPEC.md §11.1 invariant 9).`;
|
|
451
|
+
}
|
|
452
|
+
const builtin = builtinProtectedPathClass(entry.path);
|
|
453
|
+
if (builtin === "log.mutate" || builtin === "policy.core") {
|
|
454
|
+
return `protected_paths entry ${JSON.stringify(entry.path)} routes a built-in ${builtin} path to ${JSON.stringify(parsedEntry.routed)}. That route can never fire — the runtime answers a path by the strictest surface it names, and ${builtin} is decided before any policy entry is read — so the policy is refused rather than loaded with a rule its author believes is in force.`;
|
|
455
|
+
}
|
|
456
|
+
if (builtin === null)
|
|
457
|
+
continue;
|
|
458
|
+
const routed = resolve(load, parsedEntry.routed);
|
|
459
|
+
const ordinaryWeaker = STRICTNESS[routed.declaredAutonomy] > STRICTNESS[line.declaredAutonomy] ||
|
|
460
|
+
(STRICTNESS[routed.declaredAutonomy] === STRICTNESS[line.declaredAutonomy] &&
|
|
461
|
+
routed.liveRate !== null &&
|
|
462
|
+
line.liveRate !== null &&
|
|
463
|
+
routed.liveRate < line.liveRate);
|
|
464
|
+
const irreversibleLine = resolve(load, "policy.edit", { reversible: false });
|
|
465
|
+
const irreversibleRouted = resolve(load, parsedEntry.routed, { reversible: false });
|
|
466
|
+
const irreversibleWeaker = STRICTNESS[irreversibleRouted.declaredAutonomy] >
|
|
467
|
+
STRICTNESS[irreversibleLine.declaredAutonomy] ||
|
|
468
|
+
(STRICTNESS[irreversibleRouted.declaredAutonomy] ===
|
|
469
|
+
STRICTNESS[irreversibleLine.declaredAutonomy] &&
|
|
470
|
+
irreversibleRouted.liveRate !== null &&
|
|
471
|
+
irreversibleLine.liveRate !== null &&
|
|
472
|
+
irreversibleRouted.liveRate < irreversibleLine.liveRate);
|
|
473
|
+
if (ordinaryWeaker || irreversibleWeaker) {
|
|
474
|
+
const comparison = ordinaryWeaker
|
|
475
|
+
? `${describeLevel(routed.declaredAutonomy, routed.liveRate)} — weaker than the \`policy.edit\` line's own ${describeLevel(line.declaredAutonomy, line.liveRate)}`
|
|
476
|
+
: `${describeLevel(irreversibleRouted.declaredAutonomy, irreversibleRouted.liveRate)} for reversible: false — weaker than the \`policy.edit\` line's effective ${describeLevel(irreversibleLine.declaredAutonomy, irreversibleLine.liveRate)} for reversible: false`;
|
|
477
|
+
return `protected_paths entry ${JSON.stringify(entry.path)} routes a built-in policy.edit path to ${JSON.stringify(parsedEntry.routed)}, which resolves ${comparison}. \`protected_paths\` is additive: it may widen the protected surface and may never narrow it, and routing a built-in path to a looser sub-class would narrow it without removing anything from any list. Declare ${JSON.stringify(parsedEntry.routed)} at least as strictly as \`policy.edit\`, or route a path the runtime does not already protect.`;
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
return null;
|
|
481
|
+
}
|
|
482
|
+
/** A level and its rate, as the floor's message names them. */
|
|
483
|
+
function describeLevel(declared, liveRate) {
|
|
484
|
+
return liveRate === null ? declared : `${declared} at ${String(liveRate)}`;
|
|
485
|
+
}
|
|
486
|
+
/**
|
|
487
|
+
* Amended SPEC.md §5.2 (APRV-127): one note per place a policy still writes the
|
|
488
|
+
* bare `supervised`.
|
|
489
|
+
*
|
|
490
|
+
* The alias keeps every pre-split policy meaning exactly what its author meant:
|
|
491
|
+
* `supervised` was retrospective sampling, and `supervised-retro` is that same
|
|
492
|
+
* behaviour under its honest name. What the alias must never be is quiet. An
|
|
493
|
+
* author reading the split for the first time can reasonably believe `supervised`
|
|
494
|
+
* now means "supervised somehow, possibly live"; the note says, in the one place
|
|
495
|
+
* a reader is already looking, that it does not.
|
|
496
|
+
*
|
|
497
|
+
* Pure, total, and ordered: `defaults` first, then class patterns in sorted
|
|
498
|
+
* order, so the notes of one policy are byte-stable across runs.
|
|
499
|
+
*/
|
|
500
|
+
function aliasNotes(policy) {
|
|
501
|
+
const notes = [];
|
|
502
|
+
const say = (where) => ({
|
|
503
|
+
code: "supervised-alias",
|
|
504
|
+
where,
|
|
505
|
+
message: `${where} declares the bare \`supervised\`, which parses as \`supervised-retro\`: the action executes immediately and is sampled for review AFTERWARDS. Nothing about it changed with the autonomy split — this is the same behaviour under its honest name. Write \`supervised-retro\` to say so explicitly, or \`supervised-live: <rate>\` to have a fraction of the class stop for a human FIRST.`,
|
|
506
|
+
});
|
|
507
|
+
if (policy.defaults?.autonomy === "supervised")
|
|
508
|
+
notes.push(say("defaults.autonomy"));
|
|
509
|
+
for (const pattern of Object.keys(policy.classes ?? {}).sort()) {
|
|
510
|
+
if (policy.classes?.[pattern]?.autonomy === "supervised") {
|
|
511
|
+
notes.push(say(`classes.${pattern}`));
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
return notes;
|
|
515
|
+
}
|
|
516
|
+
/**
|
|
517
|
+
* Load, extract, parse, and validate the policy block of an `APPROVAL.md`.
|
|
518
|
+
*
|
|
519
|
+
* Discovery: `options.file` when given, otherwise `APPROVAL.md` in
|
|
520
|
+
* `options.dir` (default cwd), falling back to `APPROVALS.md`. `APPROVAL.md`
|
|
521
|
+
* wins when both exist (SPEC.md §5).
|
|
522
|
+
*
|
|
523
|
+
* Fails closed on every error path — see {@link PolicyLoadResult}. Never
|
|
524
|
+
* throws; a thrown error would be a policy bypass.
|
|
525
|
+
*
|
|
526
|
+
* This is discovery plus {@link loadPolicyText}. A caller that has already read
|
|
527
|
+
* the bytes (the gate, since APRV-142) calls the latter directly rather than
|
|
528
|
+
* paying for a second read that could see different bytes.
|
|
529
|
+
*/
|
|
530
|
+
export function loadPolicy(options = {}) {
|
|
531
|
+
const resolved = resolveFile(options);
|
|
532
|
+
if ("ok" in resolved)
|
|
533
|
+
return resolved;
|
|
534
|
+
return loadPolicyText(resolved.path, resolved.text, options.schemaDir === undefined ? {} : { schemaDir: options.schemaDir });
|
|
535
|
+
}
|
|
536
|
+
//# sourceMappingURL=policy-load.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy-load.js","sourceRoot":"","sources":["../../../src/core/policy-load.ts"],"names":[],"mappings":"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"}
|