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,478 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Class matching and autonomy resolution (SPEC.md §5.2, §7).
|
|
3
|
+
*
|
|
4
|
+
* Given a loaded policy and an action class, decide the autonomy level that
|
|
5
|
+
* governs the action, and say *why* — which rule matched, which rules were
|
|
6
|
+
* considered, and whether the irreversibility floor overrode the match.
|
|
7
|
+
*
|
|
8
|
+
* This module is pure and deterministic: no I/O, no clock, no randomness, no
|
|
9
|
+
* caching. The same `(load, actionClass, options)` always yields a deeply equal
|
|
10
|
+
* `Resolution`. Every ordering decision below is total, so candidate order and
|
|
11
|
+
* winner selection never depend on object key insertion order beyond what is
|
|
12
|
+
* explicitly documented.
|
|
13
|
+
*
|
|
14
|
+
* ## Matching grammar (SPEC.md §5.2, `schema/policy.schema.json` `classPattern`)
|
|
15
|
+
*
|
|
16
|
+
* Patterns and classes are dot-separated segments. Within a pattern:
|
|
17
|
+
*
|
|
18
|
+
* - a literal segment matches exactly that segment;
|
|
19
|
+
* - `*` in a non-final position matches exactly one segment;
|
|
20
|
+
* - a **trailing** `.*` matches **one or more** remaining segments of any depth.
|
|
21
|
+
*
|
|
22
|
+
* The "one or more" is a deliberate choice: `read.*` matches `read.web` and
|
|
23
|
+
* `read.web.page` but **not** the bare class `read`. The schema's
|
|
24
|
+
* `classPattern` admits `read` and `read.*` as two distinct keys a policy may
|
|
25
|
+
* list separately with different autonomy, so they must not be aliases of one
|
|
26
|
+
* another; and §7 introduces `read.*` as a *namespace*, i.e. the things under
|
|
27
|
+
* `read`, not `read` itself. A policy that wants the bare class covered writes
|
|
28
|
+
* it as its own rule (or relies on `defaults.autonomy`).
|
|
29
|
+
*
|
|
30
|
+
* A bare `*` pattern is a single-segment pattern whose only segment is a
|
|
31
|
+
* wildcard, and it is not "trailing `.*`" — it matches any single-segment class
|
|
32
|
+
* (`read`, `deploy`) and nothing deeper. `*.*` is a wildcard followed by a
|
|
33
|
+
* trailing wildcard, so it matches any class of TWO OR MORE segments. (APRV-137
|
|
34
|
+
* corrects this line, which read "exactly two". The trailing `.*` consumes one
|
|
35
|
+
* or more, so `*.*` matches `a.b` and `a.b.c` alike. `matchesPattern` always
|
|
36
|
+
* behaved this way; only the comment was wrong.)
|
|
37
|
+
*
|
|
38
|
+
* ## Specificity (SPEC.md §5.2, Specificity bullet)
|
|
39
|
+
*
|
|
40
|
+
* Candidates are ordered by the two-part key
|
|
41
|
+
* `(literalSegments DESC, wildcardSegments ASC)`. A trailing `.*` counts as one
|
|
42
|
+
* wildcard segment and contributes no literals. Patterns still tied are equally
|
|
43
|
+
* specific, and then "deny beats allow" decides: the strictest autonomy among
|
|
44
|
+
* the tied rules wins.
|
|
45
|
+
*
|
|
46
|
+
* ## Fail-closed
|
|
47
|
+
*
|
|
48
|
+
* ## The autonomy split (amended SPEC.md §5.2, APRV-127)
|
|
49
|
+
*
|
|
50
|
+
* A rule may declare `supervised-live` (with a `live_rate`) or `supervised-retro`
|
|
51
|
+
* as well as the pre-split `supervised`. Both collapse onto the one enforced
|
|
52
|
+
* `supervised` autonomy, and the difference travels beside it as
|
|
53
|
+
* `Resolution.supervision`: `"live"` means a `live_rate` fraction of the class's
|
|
54
|
+
* actions stop at the human gate BEFORE executing, `"retro"` means every action
|
|
55
|
+
* proceeds and a fraction is reviewed AFTERWARDS. Bare `supervised` is `"retro"`,
|
|
56
|
+
* with a load-time note from `policy-load.ts` naming the alias.
|
|
57
|
+
*
|
|
58
|
+
* Nothing about the SELECTION lives here: this module is pure, and selection
|
|
59
|
+
* needs an operator-held secret. `core/sampler.ts` derives it, and `core/gate.ts`
|
|
60
|
+
* applies it at intake.
|
|
61
|
+
*
|
|
62
|
+
* A not-ok {@link PolicyLoadResult} resolves **every** class to `manual` with
|
|
63
|
+
* provenance `"fail-closed"` — see `policy-load.ts`. An absent
|
|
64
|
+
* `defaults.autonomy` is likewise `manual` (provenance `"default"`): the schema
|
|
65
|
+
* permits omitting `defaults`, and the absence of a grant is not a grant.
|
|
66
|
+
*
|
|
67
|
+
* ## `human-only` (amended SPEC.md §5.2, APRV-185)
|
|
68
|
+
*
|
|
69
|
+
* A fourth level, and the strictest: an action reserved to human hands, taken
|
|
70
|
+
* outside agent execution entirely. It resolves like any other level and
|
|
71
|
+
* nothing here refuses anything — this module is pure — but every enforcement
|
|
72
|
+
* path downstream refuses it with the code `class-human-only`, so a resolution
|
|
73
|
+
* carrying it authorizes no request, no decision, no token and no run.
|
|
74
|
+
*
|
|
75
|
+
* The fail-closed target stays `manual` and deliberately does not follow the
|
|
76
|
+
* new head of the strictness table. A policy that cannot be parsed must remain
|
|
77
|
+
* recoverable through its own gate, and a broken file whose every class became
|
|
78
|
+
* `human-only` would put the repair behind a level that admits no gated repair.
|
|
79
|
+
* Failing closed raises the scrutiny an action gets; it does not remove the
|
|
80
|
+
* path by which a human fixes the file.
|
|
81
|
+
*/
|
|
82
|
+
/**
|
|
83
|
+
* Strictness order, strictest first (SPEC.md §5.2 "deny beats allow"), over the
|
|
84
|
+
* DECLARED vocabulary.
|
|
85
|
+
*
|
|
86
|
+
* `supervised-live` sits between `manual` and the retrospective modes because it
|
|
87
|
+
* is the only supervised mode that can stop an action before it happens: at rate
|
|
88
|
+
* 1 it is `manual`, at any lower rate it is strictly more scrutiny than review
|
|
89
|
+
* after the fact. `supervised` and `supervised-retro` share a rank because they
|
|
90
|
+
* are the same level under two spellings; the lexicographic tie-break in
|
|
91
|
+
* {@link compareCandidates} then decides between two equally specific rules that
|
|
92
|
+
* spell it differently, deterministically and without preferring either word.
|
|
93
|
+
*
|
|
94
|
+
* Exported because `core/policy-explain.ts` needs the same order to name the
|
|
95
|
+
* tie-break in its trace, and a private mirror of this table there is exactly
|
|
96
|
+
* the drift a decision trace must never have from the decision.
|
|
97
|
+
*
|
|
98
|
+
* The RATE is not part of the order. A tie between `supervised-live 0.5` and
|
|
99
|
+
* `supervised-live 0.01` is a tie between two equally specific rules that
|
|
100
|
+
* disagree about a fraction, and ordering by rate would let a policy author move
|
|
101
|
+
* a rule's precedence by editing a number they were only tuning. The
|
|
102
|
+
* lexicographic tie-break settles it, exactly as it settles every other tie.
|
|
103
|
+
*
|
|
104
|
+
* APRV-185 puts `human-only` above `manual` at the head of the table, and this
|
|
105
|
+
* table is the one place the ordering exists: the tie-break below,
|
|
106
|
+
* `core/policy-explain.ts`'s trace, and `core/agents-md.ts`'s draft merge all
|
|
107
|
+
* read it and hold no copy. It sits above `manual` because it is strictly more
|
|
108
|
+
* scrutiny — `manual` says a human decides and an agent then acts, `human-only`
|
|
109
|
+
* says the human acts — so a tie between the two must resolve to the level that
|
|
110
|
+
* lets no agent execute.
|
|
111
|
+
*/
|
|
112
|
+
export const STRICTNESS = {
|
|
113
|
+
"human-only": 0,
|
|
114
|
+
manual: 1,
|
|
115
|
+
"supervised-live": 2,
|
|
116
|
+
supervised: 3,
|
|
117
|
+
"supervised-retro": 3,
|
|
118
|
+
autonomous: 4,
|
|
119
|
+
};
|
|
120
|
+
/**
|
|
121
|
+
* Collapse a declared level onto the enforced {@link Autonomy} plus its
|
|
122
|
+
* supervision mode and live rate.
|
|
123
|
+
*
|
|
124
|
+
* Pure and total. A `supervised-live` rule whose `live_rate` is absent, or is
|
|
125
|
+
* not a usable proportion, resolves to **1** — every action in the class is
|
|
126
|
+
* gated. `policy.schema.json` requires the key, so this branch is unreachable
|
|
127
|
+
* for a policy that loaded; it is here as the fail-closed backstop, and the
|
|
128
|
+
* direction is the one the rest of this runtime takes everywhere else. The
|
|
129
|
+
* alternative reading, "a rate we could not understand means gate none of them",
|
|
130
|
+
* would turn a typo into a silently disabled control, which is the failure this
|
|
131
|
+
* project exists to prevent.
|
|
132
|
+
*
|
|
133
|
+
* `human-only` (APRV-185) collapses onto itself carrying nothing, exactly as
|
|
134
|
+
* `manual` and `autonomous` do. It names no supervision because it describes no
|
|
135
|
+
* agent execution to supervise, and the schema forbids both rates on it, so
|
|
136
|
+
* there is no fraction here for a reader to misread as live.
|
|
137
|
+
*/
|
|
138
|
+
export function supervisionOf(declared, rule) {
|
|
139
|
+
if (declared === "human-only" || declared === "manual" || declared === "autonomous") {
|
|
140
|
+
return { autonomy: declared, supervision: null, liveRate: null, retroRate: null };
|
|
141
|
+
}
|
|
142
|
+
// APRV-183. A `retro_rate` is carried by every supervised mode, live included:
|
|
143
|
+
// the fraction a live draw does not gate executes and stays in the
|
|
144
|
+
// retrospective pool, so that pool has a rate whether or not the class also
|
|
145
|
+
// gates some of its actions. An unusable value is read as absent, which leaves
|
|
146
|
+
// the class on the global rate rather than on an invented one.
|
|
147
|
+
const retro = rule?.retro_rate;
|
|
148
|
+
const retroRate = typeof retro === "number" && Number.isFinite(retro) && retro > 0 && retro <= 1 ? retro : null;
|
|
149
|
+
if (declared !== "supervised-live") {
|
|
150
|
+
return { autonomy: "supervised", supervision: "retro", liveRate: null, retroRate };
|
|
151
|
+
}
|
|
152
|
+
const rate = rule?.live_rate;
|
|
153
|
+
const usable = typeof rate === "number" && Number.isFinite(rate) && rate > 0 && rate <= 1;
|
|
154
|
+
return { autonomy: "supervised", supervision: "live", liveRate: usable ? rate : 1, retroRate };
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* The refusal every enforcement path prints for a `human-only` class (APRV-185).
|
|
158
|
+
*
|
|
159
|
+
* One text, in one place, for the same reason `STRICTNESS` is one table: the
|
|
160
|
+
* code `class-human-only` is frozen in four separate unions (`core/gate.ts`,
|
|
161
|
+
* `core/token.ts`, `core/execute.ts`, and the hook's own), and four hand-written
|
|
162
|
+
* explanations of one condition would disagree about what a caller should do the
|
|
163
|
+
* first time one of them was edited.
|
|
164
|
+
*
|
|
165
|
+
* `whatWasRefused` is the verb's own half of the sentence, so the message names
|
|
166
|
+
* the thing that did not happen as well as the reason it cannot.
|
|
167
|
+
*/
|
|
168
|
+
export function humanOnlyRefusal(actionClass, whatWasRefused) {
|
|
169
|
+
return (`class ${actionClass} resolves to human-only (amended SPEC.md §5.2, APRV-185), so ${whatWasRefused}. ` +
|
|
170
|
+
`A human performs this action outside agent execution: the policy reserves the class to human hands rather than routing it through the gate, so there is no approval to seek, no approver to ask, and no token that could exist for it. ` +
|
|
171
|
+
`This is not a rejection — nobody decided anything, and asking again with a better summary will get the same answer. ` +
|
|
172
|
+
`Nothing was appended. If the class should be gated rather than reserved, amend APPROVAL.md and re-attest it.`);
|
|
173
|
+
}
|
|
174
|
+
const WILDCARD = "*";
|
|
175
|
+
/** Split a dotted class or pattern into segments. */
|
|
176
|
+
function segments(text) {
|
|
177
|
+
return text.split(".");
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Does `pattern` match `actionClass`?
|
|
181
|
+
*
|
|
182
|
+
* See the module header for the grammar. Both are split on `.`; the pattern's
|
|
183
|
+
* final segment is the only one that may span more than one class segment, and
|
|
184
|
+
* only when the pattern has more than one segment (a bare `*` is single-span).
|
|
185
|
+
*/
|
|
186
|
+
export function matchesPattern(pattern, actionClass) {
|
|
187
|
+
const patternSegments = segments(pattern);
|
|
188
|
+
const classSegments = segments(actionClass);
|
|
189
|
+
const lastIndex = patternSegments.length - 1;
|
|
190
|
+
const hasTrailingWildcard = patternSegments.length > 1 && patternSegments[lastIndex] === WILDCARD;
|
|
191
|
+
if (hasTrailingWildcard) {
|
|
192
|
+
// Trailing `.*` consumes ONE OR MORE segments: the class must be strictly
|
|
193
|
+
// deeper than the pattern's literal prefix.
|
|
194
|
+
if (classSegments.length < patternSegments.length)
|
|
195
|
+
return false;
|
|
196
|
+
}
|
|
197
|
+
else if (classSegments.length !== patternSegments.length) {
|
|
198
|
+
return false;
|
|
199
|
+
}
|
|
200
|
+
const fixedCount = hasTrailingWildcard ? lastIndex : patternSegments.length;
|
|
201
|
+
for (let index = 0; index < fixedCount; index += 1) {
|
|
202
|
+
const patternSegment = patternSegments[index];
|
|
203
|
+
if (patternSegment === WILDCARD)
|
|
204
|
+
continue;
|
|
205
|
+
if (patternSegment !== classSegments[index])
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
return true;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Specificity key of a pattern (SPEC.md §5.2). A trailing `.*` is one wildcard
|
|
212
|
+
* segment contributing no literals — which is exactly how it is already counted
|
|
213
|
+
* by segment splitting, so no special case is needed here.
|
|
214
|
+
*/
|
|
215
|
+
export function specificityOf(pattern) {
|
|
216
|
+
const patternSegments = segments(pattern);
|
|
217
|
+
let wildcards = 0;
|
|
218
|
+
for (const segment of patternSegments) {
|
|
219
|
+
if (segment === WILDCARD)
|
|
220
|
+
wildcards += 1;
|
|
221
|
+
}
|
|
222
|
+
return [patternSegments.length - wildcards, wildcards, patternSegments.length];
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Compare two specificity keys; negative when `a` is MORE specific.
|
|
226
|
+
*
|
|
227
|
+
* There are only two ordering legs, not three. Every segment is either a
|
|
228
|
+
* literal or a wildcard, so `totalSegments === literalSegments +
|
|
229
|
+
* wildcardSegments` for every pattern. Two keys that tie on literals and again
|
|
230
|
+
* on wildcards therefore have equal totals by arithmetic, and a third leg
|
|
231
|
+
* comparing totals could never separate them. SPEC.md §5.2 used to list that
|
|
232
|
+
* comparison as criterion (3); it was removed as dead text (APRV-136). Keys
|
|
233
|
+
* reaching the end of this function are genuinely equal, and the caller
|
|
234
|
+
* resolves them with the strictest-autonomy rule.
|
|
235
|
+
*/
|
|
236
|
+
function compareSpecificity(a, b) {
|
|
237
|
+
if (a[0] !== b[0])
|
|
238
|
+
return b[0] - a[0]; // more literals first
|
|
239
|
+
if (a[1] !== b[1])
|
|
240
|
+
return a[1] - b[1]; // fewer wildcards first
|
|
241
|
+
return 0; // equal literals and wildcards implies equal totals: a real tie
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Total order over candidates: specificity first, then pattern name ascending.
|
|
245
|
+
*
|
|
246
|
+
* The lexicographic tail is not policy semantics — it exists so `candidates`
|
|
247
|
+
* has one canonical order for equally specific rules, independent of YAML key
|
|
248
|
+
* order, making the trace byte-stable.
|
|
249
|
+
*/
|
|
250
|
+
function compareCandidates(a, b) {
|
|
251
|
+
const bySpecificity = compareSpecificity(a.specificity, b.specificity);
|
|
252
|
+
if (bySpecificity !== 0)
|
|
253
|
+
return bySpecificity;
|
|
254
|
+
return a.pattern < b.pattern ? -1 : a.pattern > b.pattern ? 1 : 0;
|
|
255
|
+
}
|
|
256
|
+
const FAIL_CLOSED = {
|
|
257
|
+
autonomy: "manual",
|
|
258
|
+
declaredAutonomy: "manual",
|
|
259
|
+
supervision: null,
|
|
260
|
+
liveRate: null,
|
|
261
|
+
retroRate: null,
|
|
262
|
+
provenance: "fail-closed",
|
|
263
|
+
matched: null,
|
|
264
|
+
approvers: null,
|
|
265
|
+
limits: null,
|
|
266
|
+
floorApplied: false,
|
|
267
|
+
allowIrreversible: false,
|
|
268
|
+
irreversiblePatterns: [],
|
|
269
|
+
candidates: [],
|
|
270
|
+
};
|
|
271
|
+
/**
|
|
272
|
+
* Resolve the autonomy governing `actionClass` under `load`.
|
|
273
|
+
*
|
|
274
|
+
* 1. A not-ok load resolves `manual` / `"fail-closed"` for every class.
|
|
275
|
+
* 2. Otherwise collect matching `classes` rules, order them by specificity, and
|
|
276
|
+
* take the most specific; among a full specificity tie the strictest
|
|
277
|
+
* autonomy wins, and among equally strict tied rules the lexicographically
|
|
278
|
+
* smallest pattern is chosen so the outcome is deterministic.
|
|
279
|
+
* 3. With no matching rule, a class in the `policy.edit.*` namespace (APRV-266)
|
|
280
|
+
* inherits the `policy.edit` line when that line is a rule, with provenance
|
|
281
|
+
* `"inherited"`; otherwise the result is `defaults.autonomy` — or `manual`
|
|
282
|
+
* when `defaults` or `defaults.autonomy` is absent — with provenance
|
|
283
|
+
* `"default"`.
|
|
284
|
+
* 4. Finally, `options.reversible === false` engages the §7 floor: a resolved
|
|
285
|
+
* `autonomous` or `supervised` becomes `manual` with `floorApplied: true`
|
|
286
|
+
* and provenance `"floor"`. An already-`manual` outcome is untouched, and
|
|
287
|
+
* keeps its original provenance, because the floor did not decide it.
|
|
288
|
+
*
|
|
289
|
+
* `approvers` and `limits` are carried from the matched rule only; they are
|
|
290
|
+
* `null` when the rule omits them or when no rule matched.
|
|
291
|
+
*/
|
|
292
|
+
export function resolve(load, actionClass, options = {}) {
|
|
293
|
+
if (!load.ok)
|
|
294
|
+
return { ...FAIL_CLOSED, candidates: [] };
|
|
295
|
+
const classes = load.policy.classes ?? {};
|
|
296
|
+
const candidates = [];
|
|
297
|
+
for (const pattern of Object.keys(classes)) {
|
|
298
|
+
const rule = classes[pattern];
|
|
299
|
+
if (rule === undefined)
|
|
300
|
+
continue;
|
|
301
|
+
if (!matchesPattern(pattern, actionClass))
|
|
302
|
+
continue;
|
|
303
|
+
candidates.push({ pattern, rule, specificity: specificityOf(pattern) });
|
|
304
|
+
}
|
|
305
|
+
candidates.sort(compareCandidates);
|
|
306
|
+
const resolution = candidates.length === 0
|
|
307
|
+
? fromParentOrDefaults(load, actionClass, candidates)
|
|
308
|
+
: fromRules(candidates);
|
|
309
|
+
return applyFloor(resolution, options);
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* The `policy.edit` sub-class namespace (APRV-266), as a resolution rule.
|
|
313
|
+
*
|
|
314
|
+
* A routed `protected_paths` entry names a class the policy MAY declare and
|
|
315
|
+
* need not: routing `design/` to `policy.edit.design` and then writing no
|
|
316
|
+
* `policy.edit.design` line is a reasonable first step, and the answer to it
|
|
317
|
+
* should be the `policy.edit` line — the line that governed that path before
|
|
318
|
+
* the routing existed — rather than `defaults.autonomy`.
|
|
319
|
+
*
|
|
320
|
+
* That is not just ergonomics. A repository whose `policy.edit` is
|
|
321
|
+
* `supervised-live 0.1` and whose default is `manual` would find every routed
|
|
322
|
+
* path GATED the moment it adopted routing, which reads as the feature being
|
|
323
|
+
* broken and invites the author to fix it by loosening something. Falling back
|
|
324
|
+
* to the line the path is a sub-class of makes the adoption a no-op until the
|
|
325
|
+
* author declares otherwise, which is what an additive key should be.
|
|
326
|
+
*
|
|
327
|
+
* Deliberately not generalized to "any dotted class falls back to its parent".
|
|
328
|
+
* §5.2's matching grammar already gives an author `policy.edit.*` for that, and
|
|
329
|
+
* a universal parent walk would silently change the resolution of every class
|
|
330
|
+
* in the taxonomy — `read` is `manual` in this repository BECAUSE `read.*` does
|
|
331
|
+
* not cover it, and a parent walk would make that pin unstatable. One
|
|
332
|
+
* namespace, because one namespace is what the runtime itself synthesizes
|
|
333
|
+
* classes in.
|
|
334
|
+
*/
|
|
335
|
+
const ROUTED_NAMESPACE = "policy.edit.";
|
|
336
|
+
/** The line a routed class inherits from, or the ordinary default. */
|
|
337
|
+
function fromParentOrDefaults(load, actionClass, candidates) {
|
|
338
|
+
if (!actionClass.startsWith(ROUTED_NAMESPACE))
|
|
339
|
+
return fromDefaults(load, candidates);
|
|
340
|
+
const parent = resolve(load, "policy.edit");
|
|
341
|
+
// Only a RULE is inherited. When the `policy.edit` line is itself absent the
|
|
342
|
+
// sub-class has nothing to inherit and falls to `defaults.autonomy`, which is
|
|
343
|
+
// the same answer by a shorter road and keeps `"inherited"` meaning "a
|
|
344
|
+
// `policy.edit` rule decided this".
|
|
345
|
+
if (parent.provenance !== "rule")
|
|
346
|
+
return fromDefaults(load, candidates);
|
|
347
|
+
return {
|
|
348
|
+
...parent,
|
|
349
|
+
provenance: "inherited",
|
|
350
|
+
// `candidates` is this class's own, which is empty: nothing matched it.
|
|
351
|
+
// The parent's matched rule stays in `matched`, so a trace can name the
|
|
352
|
+
// line that decided without claiming it matched.
|
|
353
|
+
candidates,
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
/** Build the no-rule-matched resolution. */
|
|
357
|
+
function fromDefaults(load, candidates) {
|
|
358
|
+
// Absent `defaults.autonomy` is `manual`: the schema allows omitting
|
|
359
|
+
// `defaults` entirely, and by the fail-closed principle the absence of a
|
|
360
|
+
// grant is not a grant.
|
|
361
|
+
const declared = load.policy.defaults?.autonomy ?? "manual";
|
|
362
|
+
return {
|
|
363
|
+
...supervisionOf(declared, null),
|
|
364
|
+
declaredAutonomy: declared,
|
|
365
|
+
provenance: "default",
|
|
366
|
+
matched: null,
|
|
367
|
+
approvers: null,
|
|
368
|
+
limits: null,
|
|
369
|
+
floorApplied: false,
|
|
370
|
+
allowIrreversible: false,
|
|
371
|
+
irreversiblePatterns: [],
|
|
372
|
+
candidates,
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
/** Build the rule-matched resolution from a specificity-sorted candidate list. */
|
|
376
|
+
function fromRules(candidates) {
|
|
377
|
+
const best = candidates[0];
|
|
378
|
+
if (best === undefined)
|
|
379
|
+
throw new Error("unreachable: empty candidate list");
|
|
380
|
+
// Everything tied with the head on the full specificity key competes; among
|
|
381
|
+
// them the strictest autonomy wins ("deny beats allow"). `candidates` is
|
|
382
|
+
// already sorted by pattern within a tie, so the first strictest is the
|
|
383
|
+
// lexicographically smallest strictest — deterministic regardless of the
|
|
384
|
+
// policy file's key order.
|
|
385
|
+
let winner = best;
|
|
386
|
+
const governing = [];
|
|
387
|
+
for (const candidate of candidates) {
|
|
388
|
+
if (compareSpecificity(candidate.specificity, best.specificity) !== 0)
|
|
389
|
+
break;
|
|
390
|
+
governing.push(candidate);
|
|
391
|
+
if (STRICTNESS[candidate.rule.autonomy] < STRICTNESS[winner.rule.autonomy]) {
|
|
392
|
+
winner = candidate;
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
return {
|
|
396
|
+
...supervisionOf(winner.rule.autonomy, winner.rule),
|
|
397
|
+
declaredAutonomy: winner.rule.autonomy,
|
|
398
|
+
provenance: "rule",
|
|
399
|
+
matched: { pattern: winner.pattern, rule: winner.rule },
|
|
400
|
+
approvers: winner.rule.approvers ?? null,
|
|
401
|
+
limits: winner.rule.limits ?? null,
|
|
402
|
+
floorApplied: false,
|
|
403
|
+
// APRV-317: lexicographic order and strictness still select the ordinary
|
|
404
|
+
// winner, but neither may silently discard a tied rule's refusal to waive
|
|
405
|
+
// the floor. The capability is the intersection of the governing group.
|
|
406
|
+
allowIrreversible: governing.every((candidate) => candidate.rule.allow_irreversible === true),
|
|
407
|
+
irreversiblePatterns: governing.map((candidate) => candidate.pattern),
|
|
408
|
+
candidates,
|
|
409
|
+
};
|
|
410
|
+
}
|
|
411
|
+
/**
|
|
412
|
+
* SPEC.md §7 irreversibility floor, applied *after* class resolution: an action
|
|
413
|
+
* declared `reversible: false` resolves to `manual` unless the attested class
|
|
414
|
+
* rule group explicitly permits it. When no permission exists, the resolution
|
|
415
|
+
* records that the floor, rather than the matched rule, determined the outcome.
|
|
416
|
+
*
|
|
417
|
+
* ## The floor is a floor, not a proof (amended SPEC.md §7, APRV-127)
|
|
418
|
+
*
|
|
419
|
+
* This remains the enforcement point for APRV-127's default: a supervised rule
|
|
420
|
+
* with no APRV-317 opt-in sends a truthful irreversible action to manual. The
|
|
421
|
+
* only exception is the unanimous capability computed from operator policy
|
|
422
|
+
* above; action metadata has no field that can supply it.
|
|
423
|
+
*
|
|
424
|
+
* What the floor is NOT is evidence that anything else is reversible.
|
|
425
|
+
* `reversible` is SELF-REPORTED by the action's own declaration. A truthful
|
|
426
|
+
* `false` raises scrutiny to `manual`, which is the safe direction and the only
|
|
427
|
+
* direction this field is allowed to move anything (global invariant 4). A false
|
|
428
|
+
* claim of `reversible: true` — or an omitted claim — simply fails to raise it,
|
|
429
|
+
* leaving the class's declared autonomy in force. So the floor catches the
|
|
430
|
+
* honest declaration of irreversibility; it cannot catch a lie, and no code here
|
|
431
|
+
* pretends otherwise. The control that answers the lie is the class rule: an
|
|
432
|
+
* author who does not trust a class's declarations writes `manual` for the
|
|
433
|
+
* class, which no declaration can loosen.
|
|
434
|
+
*
|
|
435
|
+
* The floor also clears `supervision`, `liveRate` and `retroRate`. An action
|
|
436
|
+
* pushed to `manual` is not a supervised action with a mode; it is gated, and
|
|
437
|
+
* leaving either fraction on it would tell a downstream reader that a draw still
|
|
438
|
+
* applies to an action every one of whose instances stops for a human.
|
|
439
|
+
*
|
|
440
|
+
* ## The floor stops at `manual` (amended SPEC.md §7, APRV-185)
|
|
441
|
+
*
|
|
442
|
+
* The floor raises to `manual` and never to `human-only`, in either direction.
|
|
443
|
+
* It never raises a class TO `human-only`, because the floor is a runtime
|
|
444
|
+
* escalation computed from a self-reported field, and `human-only` is a
|
|
445
|
+
* declaration a policy author makes about who performs an action. Deriving one
|
|
446
|
+
* from the other would let a `reversible: false` on an envelope reserve a class
|
|
447
|
+
* to human hands that its author put behind an ordinary gate. And it never
|
|
448
|
+
* lowers a `human-only` class either: the early return below covers it, so an
|
|
449
|
+
* irreversible action in a human-only class stays human-only rather than being
|
|
450
|
+
* "raised" to the weaker level.
|
|
451
|
+
*/
|
|
452
|
+
function applyFloor(resolution, options) {
|
|
453
|
+
if (options.reversible !== false)
|
|
454
|
+
return resolution;
|
|
455
|
+
if (resolution.autonomy === "manual" || resolution.autonomy === "human-only")
|
|
456
|
+
return resolution;
|
|
457
|
+
if (resolution.allowIrreversible)
|
|
458
|
+
return resolution;
|
|
459
|
+
return {
|
|
460
|
+
...resolution,
|
|
461
|
+
autonomy: "manual",
|
|
462
|
+
// Every field says manual, including the declared one. A resolution whose
|
|
463
|
+
// `autonomy` read `manual` while its `declaredAutonomy` still read
|
|
464
|
+
// `autonomous` would be one field a consumer could read and get the
|
|
465
|
+
// pre-floor answer. What the rule actually said is not lost: it is in
|
|
466
|
+
// `matched.rule.autonomy`, and `core/policy-explain.ts` records it as the
|
|
467
|
+
// grant the floor overrode.
|
|
468
|
+
declaredAutonomy: "manual",
|
|
469
|
+
supervision: null,
|
|
470
|
+
liveRate: null,
|
|
471
|
+
// A gated action has no retrospective pool to be drawn from, so it carries
|
|
472
|
+
// no retrospective rate either.
|
|
473
|
+
retroRate: null,
|
|
474
|
+
provenance: "floor",
|
|
475
|
+
floorApplied: true,
|
|
476
|
+
};
|
|
477
|
+
}
|
|
478
|
+
//# sourceMappingURL=policy-match.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy-match.js","sourceRoot":"","sources":["../../../src/core/policy-match.ts"],"names":[],"mappings":"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"}
|