@vauban-org/agent-sdk 1.0.0 → 1.3.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/CONTRACT.md +6918 -742
- package/dist/adapters/llm/anthropic-direct.d.ts +1 -0
- package/dist/adapters/llm/anthropic-direct.d.ts.map +1 -1
- package/dist/adapters/llm/anthropic-direct.js +43 -0
- package/dist/adapters/llm/anthropic-direct.js.map +1 -1
- package/dist/adapters/llm/cascade.d.ts.map +1 -1
- package/dist/adapters/llm/cascade.js +57 -14
- package/dist/adapters/llm/cascade.js.map +1 -1
- package/dist/adapters/llm/litellm.d.ts +2 -0
- package/dist/adapters/llm/litellm.d.ts.map +1 -1
- package/dist/adapters/llm/litellm.js +44 -0
- package/dist/adapters/llm/litellm.js.map +1 -1
- package/dist/compute/difficulty-estimator.d.ts +53 -0
- package/dist/compute/difficulty-estimator.d.ts.map +1 -0
- package/dist/compute/difficulty-estimator.js +82 -0
- package/dist/compute/difficulty-estimator.js.map +1 -0
- package/dist/compute/strategies/mixture-of-agents.d.ts +40 -0
- package/dist/compute/strategies/mixture-of-agents.d.ts.map +1 -0
- package/dist/compute/strategies/mixture-of-agents.js +110 -0
- package/dist/compute/strategies/mixture-of-agents.js.map +1 -0
- package/dist/compute/strategies/tree-of-thoughts.d.ts +48 -0
- package/dist/compute/strategies/tree-of-thoughts.d.ts.map +1 -0
- package/dist/compute/strategies/tree-of-thoughts.js +242 -0
- package/dist/compute/strategies/tree-of-thoughts.js.map +1 -0
- package/dist/compute/strategies/two-phase-orient.d.ts +72 -0
- package/dist/compute/strategies/two-phase-orient.d.ts.map +1 -0
- package/dist/compute/strategies/two-phase-orient.js +85 -0
- package/dist/compute/strategies/two-phase-orient.js.map +1 -0
- package/dist/constitution/types.d.ts +10 -10
- package/dist/container/protocol.d.ts +134 -0
- package/dist/container/protocol.d.ts.map +1 -0
- package/dist/container/protocol.js +157 -0
- package/dist/container/protocol.js.map +1 -0
- package/dist/container/runtime.d.ts +140 -0
- package/dist/container/runtime.d.ts.map +1 -0
- package/dist/container/runtime.js +256 -0
- package/dist/container/runtime.js.map +1 -0
- package/dist/events/catalogue.d.ts +46 -46
- package/dist/events/schemas/agent.completed.v1.d.ts +4 -4
- package/dist/events/schemas/agent.failed.v1.d.ts +2 -2
- package/dist/events/schemas/agent.hitl_resolved.v1.d.ts +2 -2
- package/dist/events/schemas/agent.started.v1.d.ts +2 -2
- package/dist/events/schemas/brain.skill.extracted.v1.d.ts +4 -4
- package/dist/events/schemas/cc.cost.anomaly_detected.v1.d.ts +2 -2
- package/dist/events/schemas/cc.cost.recorded.v1.d.ts +4 -4
- package/dist/events/schemas/citadel.sprint.analyzed.v1.d.ts +6 -6
- package/dist/events/schemas/citadel.sprint.closed.v1.d.ts +2 -2
- package/dist/events/schemas/forge.inbox.reply_classified.v1.d.ts +6 -6
- package/dist/events/schemas/forge.lead.qualified.v1.d.ts +2 -2
- package/dist/events/schemas/forge.outreach.sent.v1.d.ts +4 -4
- package/dist/events/schemas/incident.detected.v1.d.ts +2 -2
- package/dist/events/schemas/vauban.goal.checked.v1.d.ts +2 -2
- package/dist/events/schemas/vauban.rebalancing.checked.v1.d.ts +2 -2
- package/dist/events/schemas/vauban.tax.checked.v1.d.ts +2 -2
- package/dist/events/schemas/vauban.vault.analyzed.v1.d.ts +6 -6
- package/dist/identity/agent-persona.d.ts +73 -0
- package/dist/identity/agent-persona.d.ts.map +1 -0
- package/dist/identity/agent-persona.js +165 -0
- package/dist/identity/agent-persona.js.map +1 -0
- package/dist/identity/persona-prompt.d.ts +25 -0
- package/dist/identity/persona-prompt.d.ts.map +1 -0
- package/dist/identity/persona-prompt.js +71 -0
- package/dist/identity/persona-prompt.js.map +1 -0
- package/dist/identity/persona-schema.d.ts +120 -0
- package/dist/identity/persona-schema.d.ts.map +1 -0
- package/dist/identity/persona-schema.js +103 -0
- package/dist/identity/persona-schema.js.map +1 -0
- package/dist/index.d.ts +41 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +31 -1
- package/dist/index.js.map +1 -1
- package/dist/loop/minimal-loop.js +293 -287
- package/dist/memory/episodic-rrf.d.ts +114 -0
- package/dist/memory/episodic-rrf.d.ts.map +1 -0
- package/dist/memory/episodic-rrf.js +148 -0
- package/dist/memory/episodic-rrf.js.map +1 -0
- package/dist/mesh/attenuation.d.ts +78 -0
- package/dist/mesh/attenuation.d.ts.map +1 -0
- package/dist/mesh/attenuation.js +141 -0
- package/dist/mesh/attenuation.js.map +1 -0
- package/dist/mesh/delegate.d.ts +96 -0
- package/dist/mesh/delegate.d.ts.map +1 -0
- package/dist/mesh/delegate.js +172 -0
- package/dist/mesh/delegate.js.map +1 -0
- package/dist/mesh/dispatcher.d.ts +119 -0
- package/dist/mesh/dispatcher.d.ts.map +1 -0
- package/dist/mesh/dispatcher.js +207 -0
- package/dist/mesh/dispatcher.js.map +1 -0
- package/dist/mesh/index.d.ts +12 -0
- package/dist/mesh/index.d.ts.map +1 -0
- package/dist/mesh/index.js +11 -0
- package/dist/mesh/index.js.map +1 -0
- package/dist/mesh/types.d.ts +30 -0
- package/dist/mesh/types.d.ts.map +1 -0
- package/dist/mesh/types.js +11 -0
- package/dist/mesh/types.js.map +1 -0
- package/dist/orchestration/ooda/agent.d.ts.map +1 -1
- package/dist/orchestration/ooda/agent.js +36 -0
- package/dist/orchestration/ooda/agent.js.map +1 -1
- package/dist/orchestration/ooda/skills.d.ts +104 -0
- package/dist/orchestration/ooda/skills.d.ts.map +1 -1
- package/dist/orchestration/ooda/skills.js +106 -0
- package/dist/orchestration/ooda/skills.js.map +1 -1
- package/dist/orchestration/ooda/types.d.ts +11 -0
- package/dist/orchestration/ooda/types.d.ts.map +1 -1
- package/dist/ports/bastion-action.contract.test.d.ts +11 -0
- package/dist/ports/bastion-action.contract.test.d.ts.map +1 -0
- package/dist/ports/bastion-action.contract.test.js +238 -0
- package/dist/ports/bastion-action.contract.test.js.map +1 -0
- package/dist/ports/bastion-action.d.ts +133 -0
- package/dist/ports/bastion-action.d.ts.map +1 -0
- package/dist/ports/bastion-action.js +73 -0
- package/dist/ports/bastion-action.js.map +1 -0
- package/dist/ports/brain.d.ts +31 -0
- package/dist/ports/brain.d.ts.map +1 -1
- package/dist/ports/brain.js +115 -1
- package/dist/ports/brain.js.map +1 -1
- package/dist/ports/citadel-action.contract.test.d.ts +11 -0
- package/dist/ports/citadel-action.contract.test.d.ts.map +1 -0
- package/dist/ports/citadel-action.contract.test.js +317 -0
- package/dist/ports/citadel-action.contract.test.js.map +1 -0
- package/dist/ports/citadel-action.d.ts +111 -0
- package/dist/ports/citadel-action.d.ts.map +1 -0
- package/dist/ports/citadel-action.js +62 -0
- package/dist/ports/citadel-action.js.map +1 -0
- package/dist/ports/compliance-contract.d.ts +123 -0
- package/dist/ports/compliance-contract.d.ts.map +1 -0
- package/dist/ports/compliance-contract.js +35 -0
- package/dist/ports/compliance-contract.js.map +1 -0
- package/dist/ports/db.d.ts +38 -0
- package/dist/ports/db.d.ts.map +1 -1
- package/dist/ports/db.js +88 -1
- package/dist/ports/db.js.map +1 -1
- package/dist/ports/delegation.contract.test.d.ts +9 -0
- package/dist/ports/delegation.contract.test.d.ts.map +1 -0
- package/dist/ports/delegation.contract.test.js +337 -0
- package/dist/ports/delegation.contract.test.js.map +1 -0
- package/dist/ports/delegation.d.ts +134 -0
- package/dist/ports/delegation.d.ts.map +1 -0
- package/dist/ports/delegation.js +105 -0
- package/dist/ports/delegation.js.map +1 -0
- package/dist/ports/event-bus.d.ts +29 -0
- package/dist/ports/event-bus.d.ts.map +1 -1
- package/dist/ports/event-bus.js +106 -1
- package/dist/ports/event-bus.js.map +1 -1
- package/dist/ports/federation.contract.test.d.ts +9 -0
- package/dist/ports/federation.contract.test.d.ts.map +1 -0
- package/dist/ports/federation.contract.test.js +279 -0
- package/dist/ports/federation.contract.test.js.map +1 -0
- package/dist/ports/federation.d.ts +140 -0
- package/dist/ports/federation.d.ts.map +1 -0
- package/dist/ports/federation.js +57 -0
- package/dist/ports/federation.js.map +1 -0
- package/dist/ports/index.d.ts +28 -2
- package/dist/ports/index.d.ts.map +1 -1
- package/dist/ports/index.js +17 -2
- package/dist/ports/index.js.map +1 -1
- package/dist/ports/llm-provider.d.ts +37 -0
- package/dist/ports/llm-provider.d.ts.map +1 -1
- package/dist/ports/llm-provider.js +99 -1
- package/dist/ports/llm-provider.js.map +1 -1
- package/dist/ports/logger.d.ts +27 -0
- package/dist/ports/logger.d.ts.map +1 -1
- package/dist/ports/logger.js +87 -0
- package/dist/ports/logger.js.map +1 -1
- package/dist/ports/manifest-registry.contract.test.d.ts +9 -0
- package/dist/ports/manifest-registry.contract.test.d.ts.map +1 -0
- package/dist/ports/manifest-registry.contract.test.js +246 -0
- package/dist/ports/manifest-registry.contract.test.js.map +1 -0
- package/dist/ports/manifest-registry.d.ts +116 -0
- package/dist/ports/manifest-registry.d.ts.map +1 -0
- package/dist/ports/manifest-registry.js +79 -0
- package/dist/ports/manifest-registry.js.map +1 -0
- package/dist/ports/observability.contract.test.d.ts +12 -0
- package/dist/ports/observability.contract.test.d.ts.map +1 -0
- package/dist/ports/observability.contract.test.js +260 -0
- package/dist/ports/observability.contract.test.js.map +1 -0
- package/dist/ports/observability.d.ts +98 -0
- package/dist/ports/observability.d.ts.map +1 -0
- package/dist/ports/observability.js +59 -0
- package/dist/ports/observability.js.map +1 -0
- package/dist/ports/outcome.d.ts +26 -0
- package/dist/ports/outcome.d.ts.map +1 -1
- package/dist/ports/outcome.js +62 -1
- package/dist/ports/outcome.js.map +1 -1
- package/dist/ports/privacy.contract.test.d.ts +12 -0
- package/dist/ports/privacy.contract.test.d.ts.map +1 -0
- package/dist/ports/privacy.contract.test.js +325 -0
- package/dist/ports/privacy.contract.test.js.map +1 -0
- package/dist/ports/privacy.d.ts +132 -0
- package/dist/ports/privacy.d.ts.map +1 -0
- package/dist/ports/privacy.js +83 -0
- package/dist/ports/privacy.js.map +1 -0
- package/dist/ports/tenant-context.contract.test.d.ts +14 -0
- package/dist/ports/tenant-context.contract.test.d.ts.map +1 -0
- package/dist/ports/tenant-context.contract.test.js +352 -0
- package/dist/ports/tenant-context.contract.test.js.map +1 -0
- package/dist/ports/tenant-context.d.ts +103 -0
- package/dist/ports/tenant-context.d.ts.map +1 -0
- package/dist/ports/tenant-context.js +48 -0
- package/dist/ports/tenant-context.js.map +1 -0
- package/dist/ports/vauban-finance-action.contract.test.d.ts +11 -0
- package/dist/ports/vauban-finance-action.contract.test.d.ts.map +1 -0
- package/dist/ports/vauban-finance-action.contract.test.js +260 -0
- package/dist/ports/vauban-finance-action.contract.test.js.map +1 -0
- package/dist/ports/vauban-finance-action.d.ts +106 -0
- package/dist/ports/vauban-finance-action.d.ts.map +1 -0
- package/dist/ports/vauban-finance-action.js +60 -0
- package/dist/ports/vauban-finance-action.js.map +1 -0
- package/dist/ports/workflow-runtime.d.ts +204 -0
- package/dist/ports/workflow-runtime.d.ts.map +1 -0
- package/dist/ports/workflow-runtime.js +72 -0
- package/dist/ports/workflow-runtime.js.map +1 -0
- package/dist/proof/cert-verify.d.ts +80 -0
- package/dist/proof/cert-verify.d.ts.map +1 -0
- package/dist/proof/cert-verify.js +178 -0
- package/dist/proof/cert-verify.js.map +1 -0
- package/dist/replay/replay.d.ts.map +1 -1
- package/dist/replay/replay.js +5 -1
- package/dist/replay/replay.js.map +1 -1
- package/dist/retry/index.d.ts +129 -0
- package/dist/retry/index.d.ts.map +1 -0
- package/dist/retry/index.js +156 -0
- package/dist/retry/index.js.map +1 -0
- package/dist/retry/presets.d.ts +39 -0
- package/dist/retry/presets.d.ts.map +1 -0
- package/dist/retry/presets.js +69 -0
- package/dist/retry/presets.js.map +1 -0
- package/dist/skill-loop/ab-runner.d.ts +67 -0
- package/dist/skill-loop/ab-runner.d.ts.map +1 -0
- package/dist/skill-loop/ab-runner.js +160 -0
- package/dist/skill-loop/ab-runner.js.map +1 -0
- package/dist/skill-loop/adoption.d.ts +67 -0
- package/dist/skill-loop/adoption.d.ts.map +1 -0
- package/dist/skill-loop/adoption.js +126 -0
- package/dist/skill-loop/adoption.js.map +1 -0
- package/dist/skill-loop/candidate.d.ts +45 -0
- package/dist/skill-loop/candidate.d.ts.map +1 -0
- package/dist/skill-loop/candidate.js +43 -0
- package/dist/skill-loop/candidate.js.map +1 -0
- package/dist/skill-loop/evaluator.d.ts +42 -0
- package/dist/skill-loop/evaluator.d.ts.map +1 -0
- package/dist/skill-loop/evaluator.js +184 -0
- package/dist/skill-loop/evaluator.js.map +1 -0
- package/dist/skill-loop/index.d.ts +27 -0
- package/dist/skill-loop/index.d.ts.map +1 -0
- package/dist/skill-loop/index.js +27 -0
- package/dist/skill-loop/index.js.map +1 -0
- package/dist/skill-loop/reflexion-replay.d.ts +87 -0
- package/dist/skill-loop/reflexion-replay.d.ts.map +1 -0
- package/dist/skill-loop/reflexion-replay.js +110 -0
- package/dist/skill-loop/reflexion-replay.js.map +1 -0
- package/dist/skill-loop/sign-off.d.ts +88 -0
- package/dist/skill-loop/sign-off.d.ts.map +1 -0
- package/dist/skill-loop/sign-off.js +146 -0
- package/dist/skill-loop/sign-off.js.map +1 -0
- package/dist/skill-loop/value-metric.d.ts +55 -0
- package/dist/skill-loop/value-metric.d.ts.map +1 -0
- package/dist/skill-loop/value-metric.js +69 -0
- package/dist/skill-loop/value-metric.js.map +1 -0
- package/dist/skill-loop/versioning.d.ts +36 -0
- package/dist/skill-loop/versioning.d.ts.map +1 -0
- package/dist/skill-loop/versioning.js +47 -0
- package/dist/skill-loop/versioning.js.map +1 -0
- package/dist/skill-manifest/anchor.d.ts +91 -0
- package/dist/skill-manifest/anchor.d.ts.map +1 -0
- package/dist/skill-manifest/anchor.js +331 -0
- package/dist/skill-manifest/anchor.js.map +1 -0
- package/dist/skill-manifest/builder.d.ts +47 -0
- package/dist/skill-manifest/builder.d.ts.map +1 -0
- package/dist/skill-manifest/builder.js +93 -0
- package/dist/skill-manifest/builder.js.map +1 -0
- package/dist/skill-manifest/index.d.ts +13 -0
- package/dist/skill-manifest/index.d.ts.map +1 -0
- package/dist/skill-manifest/index.js +9 -0
- package/dist/skill-manifest/index.js.map +1 -0
- package/dist/skill-manifest/types.d.ts +67 -0
- package/dist/skill-manifest/types.d.ts.map +1 -0
- package/dist/skill-manifest/types.js +16 -0
- package/dist/skill-manifest/types.js.map +1 -0
- package/dist/skill-manifest/verifier.d.ts +42 -0
- package/dist/skill-manifest/verifier.d.ts.map +1 -0
- package/dist/skill-manifest/verifier.js +136 -0
- package/dist/skill-manifest/verifier.js.map +1 -0
- package/dist/skills/_secrets.d.ts +16 -0
- package/dist/skills/_secrets.d.ts.map +1 -0
- package/dist/skills/_secrets.js +20 -0
- package/dist/skills/_secrets.js.map +1 -0
- package/dist/skills/alpaca-quote.d.ts +2 -2
- package/dist/skills/alpaca-quote.d.ts.map +1 -1
- package/dist/skills/alpaca-quote.js +51 -20
- package/dist/skills/alpaca-quote.js.map +1 -1
- package/dist/skills/brain-query.d.ts +4 -4
- package/dist/skills/brain-store.d.ts +6 -6
- package/dist/skills/errors.d.ts +15 -0
- package/dist/skills/errors.d.ts.map +1 -1
- package/dist/skills/errors.js +21 -0
- package/dist/skills/errors.js.map +1 -1
- package/dist/skills/hitl-request.d.ts +2 -2
- package/dist/skills/index.d.ts +3 -1
- package/dist/skills/index.d.ts.map +1 -1
- package/dist/skills/index.js +4 -1
- package/dist/skills/index.js.map +1 -1
- package/dist/skills/markdown/loader.d.ts +52 -0
- package/dist/skills/markdown/loader.d.ts.map +1 -0
- package/dist/skills/markdown/loader.js +93 -0
- package/dist/skills/markdown/loader.js.map +1 -0
- package/dist/skills/markdown/schema.d.ts +432 -0
- package/dist/skills/markdown/schema.d.ts.map +1 -0
- package/dist/skills/markdown/schema.js +121 -0
- package/dist/skills/markdown/schema.js.map +1 -0
- package/dist/skills/poc-md-loader/markdown-loader.d.ts +77 -0
- package/dist/skills/poc-md-loader/markdown-loader.d.ts.map +1 -0
- package/dist/skills/poc-md-loader/markdown-loader.js +125 -0
- package/dist/skills/poc-md-loader/markdown-loader.js.map +1 -0
- package/dist/skills/poc-md-loader/runner.d.ts +24 -0
- package/dist/skills/poc-md-loader/runner.d.ts.map +1 -0
- package/dist/skills/poc-md-loader/runner.js +57 -0
- package/dist/skills/poc-md-loader/runner.js.map +1 -0
- package/dist/skills/poc-md-loader/vitest.poc.config.d.ts +3 -0
- package/dist/skills/poc-md-loader/vitest.poc.config.d.ts.map +1 -0
- package/dist/skills/poc-md-loader/vitest.poc.config.js +13 -0
- package/dist/skills/poc-md-loader/vitest.poc.config.js.map +1 -0
- package/dist/skills/poc-md-loader/web-search/script.d.ts +33 -0
- package/dist/skills/poc-md-loader/web-search/script.d.ts.map +1 -0
- package/dist/skills/poc-md-loader/web-search/script.js +75 -0
- package/dist/skills/poc-md-loader/web-search/script.js.map +1 -0
- package/dist/skills/record-outcome.d.ts +4 -4
- package/dist/skills/send-email.d.ts +2 -2
- package/dist/skills/send-email.d.ts.map +1 -1
- package/dist/skills/send-email.js +4 -3
- package/dist/skills/send-email.js.map +1 -1
- package/dist/skills/slack-notify.d.ts +4 -4
- package/dist/skills/slack-notify.d.ts.map +1 -1
- package/dist/skills/slack-notify.js +52 -21
- package/dist/skills/slack-notify.js.map +1 -1
- package/dist/skills/starknet-balance.d.ts +1 -1
- package/dist/skills/telegram-notify.d.ts +4 -4
- package/dist/skills/telegram-notify.d.ts.map +1 -1
- package/dist/skills/telegram-notify.js +48 -19
- package/dist/skills/telegram-notify.js.map +1 -1
- package/dist/skills/web-search.d.ts +1 -1
- package/dist/skills/web-search.d.ts.map +1 -1
- package/dist/skills/web-search.js +85 -40
- package/dist/skills/web-search.js.map +1 -1
- package/dist/telemetry/bus.d.ts +54 -0
- package/dist/telemetry/bus.d.ts.map +1 -0
- package/dist/telemetry/bus.js +159 -0
- package/dist/telemetry/bus.js.map +1 -0
- package/dist/telemetry/index.d.ts +35 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +30 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/telemetry/port.d.ts +121 -0
- package/dist/telemetry/port.d.ts.map +1 -0
- package/dist/telemetry/port.js +48 -0
- package/dist/telemetry/port.js.map +1 -0
- package/dist/telemetry/sinks/otlp.d.ts +45 -0
- package/dist/telemetry/sinks/otlp.d.ts.map +1 -0
- package/dist/telemetry/sinks/otlp.js +195 -0
- package/dist/telemetry/sinks/otlp.js.map +1 -0
- package/dist/telemetry/sinks/sqlite.d.ts +32 -0
- package/dist/telemetry/sinks/sqlite.d.ts.map +1 -0
- package/dist/telemetry/sinks/sqlite.js +170 -0
- package/dist/telemetry/sinks/sqlite.js.map +1 -0
- package/dist/telemetry/sinks/stdout.d.ts +22 -0
- package/dist/telemetry/sinks/stdout.d.ts.map +1 -0
- package/dist/telemetry/sinks/stdout.js +38 -0
- package/dist/telemetry/sinks/stdout.js.map +1 -0
- package/dist/testing/index.d.ts +3 -0
- package/dist/testing/test-brain-port.d.ts +4 -0
- package/dist/testing/test-brain-port.d.ts.map +1 -1
- package/dist/testing/test-brain-port.js +75 -20
- package/dist/testing/test-brain-port.js.map +1 -1
- package/dist/testing/test-event-bus.d.ts.map +1 -1
- package/dist/testing/test-event-bus.js +89 -36
- package/dist/testing/test-event-bus.js.map +1 -1
- package/dist/trace/schema.d.ts +1 -1
- package/dist/trace/schema.d.ts.map +1 -1
- package/dist/trace/schema.js +1 -1
- package/dist/trace/schema.js.map +1 -1
- package/dist/verify/formal/index.d.ts +44 -0
- package/dist/verify/formal/index.d.ts.map +1 -0
- package/dist/verify/formal/index.js +98 -0
- package/dist/verify/formal/index.js.map +1 -0
- package/dist/verify/formal/policy.d.ts +105 -0
- package/dist/verify/formal/policy.d.ts.map +1 -0
- package/dist/verify/formal/policy.js +159 -0
- package/dist/verify/formal/policy.js.map +1 -0
- package/dist/verify/formal/result.d.ts +50 -0
- package/dist/verify/formal/result.d.ts.map +1 -0
- package/dist/verify/formal/result.js +21 -0
- package/dist/verify/formal/result.js.map +1 -0
- package/dist/verify/formal/solver.d.ts +67 -0
- package/dist/verify/formal/solver.d.ts.map +1 -0
- package/dist/verify/formal/solver.js +184 -0
- package/dist/verify/formal/solver.js.map +1 -0
- package/dist/verify/formal/spec-language.d.ts +80 -0
- package/dist/verify/formal/spec-language.d.ts.map +1 -0
- package/dist/verify/formal/spec-language.js +219 -0
- package/dist/verify/formal/spec-language.js.map +1 -0
- package/docs/attestation.md +199 -0
- package/docs/identity.md +193 -0
- package/docs/telemetry/migration.md +155 -0
- package/docs/telemetry/overview.md +154 -0
- package/docs/telemetry/privacy.md +127 -0
- package/docs/telemetry/sinks/cc.md +155 -0
- package/docs/telemetry/sinks/otlp.md +146 -0
- package/docs/telemetry/sinks/sqlite.md +126 -0
- package/docs/telemetry/sinks/stdout.md +82 -0
- package/package.json +18 -2
- package/src/adapters/llm/anthropic-direct.ts +51 -0
- package/src/adapters/llm/cascade.ts +64 -19
- package/src/adapters/llm/litellm.ts +49 -0
- package/src/compute/difficulty-estimator.ts +111 -0
- package/src/compute/strategies/mixture-of-agents.ts +150 -0
- package/src/compute/strategies/tree-of-thoughts.ts +293 -0
- package/src/compute/strategies/two-phase-orient.ts +147 -0
- package/src/container/protocol.ts +243 -0
- package/src/container/runtime.ts +424 -0
- package/src/db/migrations/026_formal_verify_results.sql +30 -0
- package/src/identity/agent-persona.ts +203 -0
- package/src/identity/persona-prompt.ts +84 -0
- package/src/identity/persona-schema.ts +127 -0
- package/src/index.ts +368 -2
- package/src/memory/episodic-rrf.ts +224 -0
- package/src/mesh/attenuation.ts +190 -0
- package/src/mesh/delegate.ts +254 -0
- package/src/mesh/dispatcher.ts +301 -0
- package/src/mesh/index.ts +39 -0
- package/src/mesh/types.ts +31 -0
- package/src/orchestration/ooda/agent.ts +50 -0
- package/src/orchestration/ooda/skills.ts +177 -0
- package/src/orchestration/ooda/types.ts +12 -0
- package/src/ports/bastion-action.contract.test.ts +355 -0
- package/src/ports/bastion-action.ts +198 -0
- package/src/ports/brain.ts +177 -15
- package/src/ports/citadel-action.contract.test.ts +430 -0
- package/src/ports/citadel-action.ts +174 -0
- package/src/ports/compliance-contract.ts +191 -0
- package/src/ports/db.ts +98 -0
- package/src/ports/delegation.contract.test.ts +428 -0
- package/src/ports/delegation.ts +211 -0
- package/src/ports/event-bus.ts +133 -0
- package/src/ports/federation.contract.test.ts +355 -0
- package/src/ports/federation.ts +190 -0
- package/src/ports/index.ts +186 -1
- package/src/ports/llm-provider.ts +123 -0
- package/src/ports/logger.ts +104 -0
- package/src/ports/manifest-registry.contract.test.ts +324 -0
- package/src/ports/manifest-registry.ts +188 -0
- package/src/ports/observability.contract.test.ts +315 -0
- package/src/ports/observability.ts +150 -0
- package/src/ports/outcome.ts +69 -0
- package/src/ports/privacy.contract.test.ts +413 -0
- package/src/ports/privacy.ts +207 -0
- package/src/ports/tenant-context.contract.test.ts +454 -0
- package/src/ports/tenant-context.ts +150 -0
- package/src/ports/vauban-finance-action.contract.test.ts +335 -0
- package/src/ports/vauban-finance-action.ts +166 -0
- package/src/ports/workflow-runtime.ts +327 -0
- package/src/proof/cert-verify.ts +249 -0
- package/src/replay/replay.ts +11 -8
- package/src/retry/index.ts +227 -0
- package/src/retry/presets.ts +75 -0
- package/src/skill-loop/ab-runner.ts +196 -0
- package/src/skill-loop/adoption.ts +188 -0
- package/src/skill-loop/candidate.ts +75 -0
- package/src/skill-loop/evaluator.ts +238 -0
- package/src/skill-loop/index.ts +51 -0
- package/src/skill-loop/reflexion-replay.ts +173 -0
- package/src/skill-loop/sign-off.ts +247 -0
- package/src/skill-loop/value-metric.ts +120 -0
- package/src/skill-loop/versioning.ts +75 -0
- package/src/skill-manifest/anchor.ts +401 -0
- package/src/skill-manifest/builder.ts +129 -0
- package/src/skill-manifest/index.ts +18 -0
- package/src/skill-manifest/types.ts +72 -0
- package/src/skill-manifest/verifier.ts +198 -0
- package/src/skills/_secrets.ts +25 -0
- package/src/skills/alpaca-quote.ts +68 -23
- package/src/skills/errors.ts +30 -2
- package/src/skills/index.ts +19 -0
- package/src/skills/markdown/loader.ts +129 -0
- package/src/skills/markdown/schema.ts +144 -0
- package/src/skills/poc-md-loader/e2e-parity.test.ts +237 -0
- package/src/skills/poc-md-loader/markdown-loader.ts +161 -0
- package/src/skills/poc-md-loader/runner.ts +82 -0
- package/src/skills/poc-md-loader/vitest.poc.config.ts +13 -0
- package/src/skills/poc-md-loader/web-search/SKILL.md +42 -0
- package/src/skills/poc-md-loader/web-search/script.ts +109 -0
- package/src/skills/send-email.ts +4 -3
- package/src/skills/slack-notify.ts +73 -30
- package/src/skills/telegram-notify.ts +70 -24
- package/src/skills/web-search.ts +132 -50
- package/src/telemetry/bus.test.ts +231 -0
- package/src/telemetry/bus.ts +241 -0
- package/src/telemetry/index.ts +49 -0
- package/src/telemetry/port.ts +160 -0
- package/src/telemetry/sinks/otlp.test.ts +146 -0
- package/src/telemetry/sinks/otlp.ts +250 -0
- package/src/telemetry/sinks/sqlite.test.ts +121 -0
- package/src/telemetry/sinks/sqlite.ts +260 -0
- package/src/telemetry/sinks/stdout.test.ts +109 -0
- package/src/telemetry/sinks/stdout.ts +59 -0
- package/src/testing/test-brain-port.ts +98 -24
- package/src/testing/test-event-bus.ts +104 -43
- package/src/trace/schema.ts +1 -1
- package/src/verify/formal/index.ts +154 -0
- package/src/verify/formal/policy.ts +253 -0
- package/src/verify/formal/result.ts +52 -0
- package/src/verify/formal/solver.ts +235 -0
- package/src/verify/formal/spec-language.ts +274 -0
|
@@ -13,6 +13,8 @@
|
|
|
13
13
|
* @public
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
|
+
import type { Span } from "@opentelemetry/api";
|
|
17
|
+
import { SpanStatusCode, trace } from "@opentelemetry/api";
|
|
16
18
|
import type {
|
|
17
19
|
CloudEvent,
|
|
18
20
|
DomainEvent,
|
|
@@ -23,6 +25,8 @@ import { signEvent } from "../auth/sign-event.js";
|
|
|
23
25
|
import { verifyEvent } from "../auth/verify-event.js";
|
|
24
26
|
import { InMemoryNonceStore } from "../auth/nonce-store.js";
|
|
25
27
|
|
|
28
|
+
const TEST_TRACER = trace.getTracer("vauban-agent-sdk.ports.test", "0.1.0");
|
|
29
|
+
|
|
26
30
|
type CloudHandler = (event: CloudEvent) => Promise<void>;
|
|
27
31
|
type DomainHandler<T = unknown> = (event: DomainEvent<T>) => Promise<void>;
|
|
28
32
|
|
|
@@ -59,57 +63,114 @@ export class TestEventBus implements EventBusPort {
|
|
|
59
63
|
// ─── EventBusPort ──────────────────────────────────────────────────────────
|
|
60
64
|
|
|
61
65
|
async publish(event: CloudEvent, stream: string): Promise<void> {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
66
|
+
return TEST_TRACER.startActiveSpan(
|
|
67
|
+
"event-bus.publish",
|
|
68
|
+
{
|
|
69
|
+
attributes: {
|
|
70
|
+
"event.type": event.type,
|
|
71
|
+
"event.stream": stream,
|
|
72
|
+
"event.id": event.id,
|
|
73
|
+
"vauban.port.name": "event-bus",
|
|
74
|
+
"vauban.port.impl": "TestEventBus",
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
async (span: Span) => {
|
|
78
|
+
try {
|
|
79
|
+
if (!event.id) throw new Error("CloudEvent.id is required");
|
|
80
|
+
if (event.specversion !== "1.0")
|
|
81
|
+
throw new Error("CloudEvent.specversion must be 1.0");
|
|
82
|
+
|
|
83
|
+
const events = this.streams.get(stream) ?? [];
|
|
84
|
+
events.push(event);
|
|
85
|
+
this.streams.set(stream, events);
|
|
86
|
+
|
|
87
|
+
// Track consumed events per stream
|
|
88
|
+
const consumed = this._consumed.get(stream) ?? [];
|
|
89
|
+
consumed.push(event);
|
|
90
|
+
this._consumed.set(stream, consumed);
|
|
91
|
+
|
|
92
|
+
// Dispatch to subscribers
|
|
93
|
+
const streamSubs = this.subscribers.get(stream);
|
|
94
|
+
if (streamSubs) {
|
|
95
|
+
for (const handler of streamSubs.values()) {
|
|
96
|
+
await handler(event);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
span.setStatus({ code: SpanStatusCode.OK });
|
|
100
|
+
} catch (err) {
|
|
101
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
102
|
+
span.setStatus({ code: SpanStatusCode.ERROR, message });
|
|
103
|
+
if (err instanceof Error) span.recordException(err);
|
|
104
|
+
throw err;
|
|
105
|
+
} finally {
|
|
106
|
+
span.end();
|
|
107
|
+
}
|
|
80
108
|
}
|
|
81
|
-
|
|
109
|
+
);
|
|
82
110
|
}
|
|
83
111
|
|
|
84
112
|
async publishWithIdempotency<T>(
|
|
85
113
|
event: Omit<DomainEvent<T>, "signature">,
|
|
86
114
|
key: string
|
|
87
115
|
): Promise<void> {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
116
|
+
return TEST_TRACER.startActiveSpan(
|
|
117
|
+
"event-bus.publishWithIdempotency",
|
|
118
|
+
{
|
|
119
|
+
attributes: {
|
|
120
|
+
"event.type": event.type,
|
|
121
|
+
"event.idempotency_key": key,
|
|
122
|
+
"vauban.port.name": "event-bus",
|
|
123
|
+
"vauban.port.impl": "TestEventBus",
|
|
124
|
+
},
|
|
125
|
+
},
|
|
126
|
+
async (span: Span) => {
|
|
127
|
+
try {
|
|
128
|
+
// Dedup: silently skip if key already processed (producer-side)
|
|
129
|
+
const isNew = await this.publishIdempotencyStore.setNX(
|
|
130
|
+
key,
|
|
131
|
+
10 * 60 * 1000
|
|
132
|
+
);
|
|
133
|
+
if (!isNew) {
|
|
134
|
+
span.setAttribute("event.dedup.skipped", true);
|
|
135
|
+
span.setStatus({ code: SpanStatusCode.OK });
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// Auto-sign the event
|
|
140
|
+
const signature = signEvent(
|
|
141
|
+
event as Omit<DomainEvent, "signature">,
|
|
142
|
+
this.signingSecret
|
|
143
|
+
);
|
|
144
|
+
const signed: DomainEvent<T> = {
|
|
145
|
+
...(event as DomainEvent<T>),
|
|
146
|
+
signature,
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
// Store in domain stream
|
|
150
|
+
const streamKey = `domain:${event.type}`;
|
|
151
|
+
const stored = this.domainStreams.get(streamKey) ?? [];
|
|
152
|
+
const streamId = `${Date.now()}-${stored.length}`;
|
|
153
|
+
stored.push({ streamId, event: signed as DomainEvent });
|
|
154
|
+
this.domainStreams.set(streamKey, stored);
|
|
155
|
+
|
|
156
|
+
// Dispatch to domain subscribers
|
|
157
|
+
const typeSubs = this.domainSubscribers.get(event.type);
|
|
158
|
+
if (typeSubs) {
|
|
159
|
+
for (const handler of typeSubs.values()) {
|
|
160
|
+
await (handler as DomainHandler<T>)(signed);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
span.setStatus({ code: SpanStatusCode.OK });
|
|
164
|
+
} catch (err) {
|
|
165
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
166
|
+
span.setStatus({ code: SpanStatusCode.ERROR, message });
|
|
167
|
+
if (err instanceof Error) span.recordException(err);
|
|
168
|
+
throw err;
|
|
169
|
+
} finally {
|
|
170
|
+
span.end();
|
|
171
|
+
}
|
|
111
172
|
}
|
|
112
|
-
|
|
173
|
+
);
|
|
113
174
|
}
|
|
114
175
|
|
|
115
176
|
subscribe(
|
package/src/trace/schema.ts
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
|
|
16
16
|
/** Semver version of this trace schema. Increment MINOR on additive changes,
|
|
17
17
|
* MAJOR on breaking changes (new required fields or removed fields). */
|
|
18
|
-
export const TRACE_SCHEMA_VERSION = "
|
|
18
|
+
export const TRACE_SCHEMA_VERSION = "1.0.0" as const;
|
|
19
19
|
|
|
20
20
|
/** Status of an optional TSA receipt for a Trace. */
|
|
21
21
|
export type ReceiptStatus = "present" | "pending" | "failed";
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/verify/formal/index.ts
|
|
3
|
+
*
|
|
4
|
+
* Sprint-587 — Formal verification entry point.
|
|
5
|
+
*
|
|
6
|
+
* Orchestrates : AxiomSpec → SMT-LIB → Z3 subprocess → 4-state result →
|
|
7
|
+
* (optionally) per-axiom policy decision.
|
|
8
|
+
*
|
|
9
|
+
* When `z3` is not in PATH, every spec resolves to UNKNOWN with a uniform
|
|
10
|
+
* rationale. Callers can then apply their policies — typically resulting in
|
|
11
|
+
* escalation or log (depending on the axiom and consumer mode).
|
|
12
|
+
*
|
|
13
|
+
* @module verify/formal
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import type { FormalVerifyResult } from "./result.js";
|
|
17
|
+
import {
|
|
18
|
+
type AxiomPolicy,
|
|
19
|
+
type ConsumerMode,
|
|
20
|
+
type PolicyDecision,
|
|
21
|
+
type VerifyContext,
|
|
22
|
+
DEFAULT_POLICIES,
|
|
23
|
+
applyPolicy,
|
|
24
|
+
} from "./policy.js";
|
|
25
|
+
import { type AxiomSpec, compileToSmt } from "./spec-language.js";
|
|
26
|
+
import { checkSmt, isZ3Available } from "./solver.js";
|
|
27
|
+
|
|
28
|
+
export {
|
|
29
|
+
type FormalVerifyResult,
|
|
30
|
+
type FormalVerifyState,
|
|
31
|
+
type FormalSolver,
|
|
32
|
+
} from "./result.js";
|
|
33
|
+
export {
|
|
34
|
+
type AxiomPolicy,
|
|
35
|
+
type ConsumerMode,
|
|
36
|
+
type VerifyContext,
|
|
37
|
+
type PolicyAction,
|
|
38
|
+
type PolicyDecision,
|
|
39
|
+
type OnUnknown,
|
|
40
|
+
type OnUnsafe,
|
|
41
|
+
DEFAULT_POLICIES,
|
|
42
|
+
applyPolicy,
|
|
43
|
+
} from "./policy.js";
|
|
44
|
+
export {
|
|
45
|
+
type AxiomSpec,
|
|
46
|
+
type Condition,
|
|
47
|
+
AXIOM_SPECS,
|
|
48
|
+
compileToSmt,
|
|
49
|
+
} from "./spec-language.js";
|
|
50
|
+
export {
|
|
51
|
+
type SmtCheckResult,
|
|
52
|
+
type SolverOptions,
|
|
53
|
+
checkSmt,
|
|
54
|
+
isZ3Available,
|
|
55
|
+
} from "./solver.js";
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Bundle returned by {@link formalVerify} : the raw verification result plus
|
|
59
|
+
* the policy-resolved decision.
|
|
60
|
+
*/
|
|
61
|
+
export interface FormalVerifyDecision {
|
|
62
|
+
result: FormalVerifyResult;
|
|
63
|
+
decision: PolicyDecision;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Verify every supplied AxiomSpec, apply the per-axiom policy, and return
|
|
68
|
+
* one {@link FormalVerifyDecision} per spec.
|
|
69
|
+
*
|
|
70
|
+
* If `z3` is not available on PATH, every result is UNKNOWN with
|
|
71
|
+
* `solver: "none"`, and the policy layer handles routing.
|
|
72
|
+
*
|
|
73
|
+
* @param axiomSpecs List of specs to verify (typically derived from
|
|
74
|
+
* {@link AXIOM_SPECS}, possibly customised).
|
|
75
|
+
* @param mode Consumer mode (strict / permissive / audit_only).
|
|
76
|
+
* @param context Calling context (runtime / skill_ingestion).
|
|
77
|
+
* @param customPolicies Optional override map keyed by axiom label.
|
|
78
|
+
*/
|
|
79
|
+
export async function formalVerify(
|
|
80
|
+
axiomSpecs: AxiomSpec[],
|
|
81
|
+
mode: ConsumerMode,
|
|
82
|
+
context: VerifyContext,
|
|
83
|
+
customPolicies?: Partial<Record<string, AxiomPolicy>>
|
|
84
|
+
): Promise<FormalVerifyDecision[]> {
|
|
85
|
+
const z3Available = await isZ3Available();
|
|
86
|
+
|
|
87
|
+
const out: FormalVerifyDecision[] = [];
|
|
88
|
+
|
|
89
|
+
for (const spec of axiomSpecs) {
|
|
90
|
+
const policy = customPolicies?.[spec.axiom] ??
|
|
91
|
+
DEFAULT_POLICIES[
|
|
92
|
+
spec.axiom
|
|
93
|
+
] ?? // Fallback policy for unknown axioms : permissive defaults.
|
|
94
|
+
{
|
|
95
|
+
onSafe: "proceed" as const,
|
|
96
|
+
onUnsafe: "escalate_human" as const,
|
|
97
|
+
onUnknown: "proceed_with_log" as const,
|
|
98
|
+
timeout_ms: spec.timeout_ms ?? 5000,
|
|
99
|
+
skillLoopStrict: true,
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
const timeout_ms = spec.timeout_ms ?? policy.timeout_ms ?? 5000;
|
|
103
|
+
|
|
104
|
+
let result: FormalVerifyResult;
|
|
105
|
+
|
|
106
|
+
if (!z3Available) {
|
|
107
|
+
result = {
|
|
108
|
+
state: "UNKNOWN",
|
|
109
|
+
axiom: spec.axiom,
|
|
110
|
+
rationale: "z3 binary not available on PATH",
|
|
111
|
+
time_ms: 0,
|
|
112
|
+
solver: "none",
|
|
113
|
+
};
|
|
114
|
+
} else {
|
|
115
|
+
const smt = compileToSmt(spec);
|
|
116
|
+
const smtRes = await checkSmt(smt, { timeout_ms });
|
|
117
|
+
|
|
118
|
+
if (smtRes.sat === false) {
|
|
119
|
+
// unsat → no counterexample → property holds → SAFE
|
|
120
|
+
result = {
|
|
121
|
+
state: "SAFE",
|
|
122
|
+
axiom: spec.axiom,
|
|
123
|
+
rationale: `Z3 proved post-conditions hold for axiom ${spec.axiom}`,
|
|
124
|
+
time_ms: smtRes.time_ms,
|
|
125
|
+
solver: "z3",
|
|
126
|
+
};
|
|
127
|
+
} else if (smtRes.sat === true) {
|
|
128
|
+
// sat → counterexample → property violated → UNSAFE
|
|
129
|
+
result = {
|
|
130
|
+
state: "UNSAFE",
|
|
131
|
+
axiom: spec.axiom,
|
|
132
|
+
rationale: `Z3 found a counterexample for axiom ${spec.axiom}`,
|
|
133
|
+
counterexample: smtRes.model,
|
|
134
|
+
time_ms: smtRes.time_ms,
|
|
135
|
+
solver: "z3",
|
|
136
|
+
};
|
|
137
|
+
} else {
|
|
138
|
+
// null → unknown / timeout / error → UNKNOWN
|
|
139
|
+
result = {
|
|
140
|
+
state: "UNKNOWN",
|
|
141
|
+
axiom: spec.axiom,
|
|
142
|
+
rationale: smtRes.reason ?? "z3 returned unknown",
|
|
143
|
+
time_ms: smtRes.time_ms,
|
|
144
|
+
solver: "z3",
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
const decision = applyPolicy(result, policy as AxiomPolicy, mode, context);
|
|
150
|
+
out.push({ result, decision });
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
return out;
|
|
154
|
+
}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/verify/formal/policy.ts
|
|
3
|
+
*
|
|
4
|
+
* Sprint-587 — Per-axiom policy + consumer mode resolution.
|
|
5
|
+
*
|
|
6
|
+
* The policy layer maps a 4-state {@link FormalVerifyResult} to an action
|
|
7
|
+
* (proceed / block / escalate / log), parameterised by :
|
|
8
|
+
* - the axiom (Robuste, Institutionnel, … — each has different sensitivity)
|
|
9
|
+
* - the consumer mode (strict / permissive / audit_only)
|
|
10
|
+
* - the calling context (runtime vs skill_ingestion — see Tension Sprint C)
|
|
11
|
+
*
|
|
12
|
+
* Tension Sprint C : skill-loop ingestion is ALWAYS strict on UNKNOWN.
|
|
13
|
+
* Even if the runtime policy says "proceed_with_log" on UNKNOWN for the
|
|
14
|
+
* Profitable axiom, the skill-ingestion path must refuse to ingest the
|
|
15
|
+
* skill until UNKNOWN becomes SAFE. This prevents UNKNOWN-tainted skills
|
|
16
|
+
* from accumulating in the skill library.
|
|
17
|
+
*
|
|
18
|
+
* @module verify/formal/policy
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import type { FormalVerifyResult } from "./result.js";
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Action chosen by the policy resolver.
|
|
25
|
+
*
|
|
26
|
+
* `proceed` : continue without intervention
|
|
27
|
+
* `block` : refuse the operation outright
|
|
28
|
+
* `escalate_human` : pause and request human approval (HITL)
|
|
29
|
+
* `log` : continue but emit an audit-grade log entry
|
|
30
|
+
*/
|
|
31
|
+
export type PolicyAction = "proceed" | "block" | "escalate_human" | "log";
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Strategy for handling UNKNOWN outcomes.
|
|
35
|
+
*
|
|
36
|
+
* `escalate_human` : refuse to make a unilateral decision
|
|
37
|
+
* `proceed_with_log` : continue and emit a regular log entry
|
|
38
|
+
* `proceed_with_audit_log`: continue and emit an audit-grade log entry
|
|
39
|
+
*/
|
|
40
|
+
export type OnUnknown =
|
|
41
|
+
| "escalate_human"
|
|
42
|
+
| "proceed_with_log"
|
|
43
|
+
| "proceed_with_audit_log";
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Strategy for handling UNSAFE outcomes — either hard-block or escalate.
|
|
47
|
+
*/
|
|
48
|
+
export type OnUnsafe = "block" | "escalate_human";
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Policy bundle for one axiom.
|
|
52
|
+
*
|
|
53
|
+
* `skillLoopStrict` is ALWAYS true by design : it is exposed as a field so
|
|
54
|
+
* downstream code can read it but is not configurable (see Tension Sprint C).
|
|
55
|
+
*/
|
|
56
|
+
export interface AxiomPolicy {
|
|
57
|
+
/** Action on SAFE. Fixed at `"proceed"` — kept explicit for symmetry. */
|
|
58
|
+
onSafe: "proceed";
|
|
59
|
+
/** Action on UNSAFE. */
|
|
60
|
+
onUnsafe: OnUnsafe;
|
|
61
|
+
/** Action on UNKNOWN. */
|
|
62
|
+
onUnknown: OnUnknown;
|
|
63
|
+
/** Solver timeout for this axiom, in milliseconds. */
|
|
64
|
+
timeout_ms: number;
|
|
65
|
+
/**
|
|
66
|
+
* Skill-loop ingestion strict mode — always true. Exposed so callers can
|
|
67
|
+
* assert the invariant. Do not set to false ; Tension Sprint C invariant.
|
|
68
|
+
*/
|
|
69
|
+
skillLoopStrict: boolean;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Default per-axiom policies.
|
|
74
|
+
*
|
|
75
|
+
* Rationale :
|
|
76
|
+
* Robuste / Institutionnel : hard axioms — UNSAFE blocks, UNKNOWN escalates
|
|
77
|
+
* SOTA : UNKNOWN allowed with audit log (SOTA evolves)
|
|
78
|
+
* AntiFragile / Profitable : softer — UNSAFE escalates, UNKNOWN logs
|
|
79
|
+
*/
|
|
80
|
+
export const DEFAULT_POLICIES: Record<string, AxiomPolicy> = {
|
|
81
|
+
Robuste: {
|
|
82
|
+
onSafe: "proceed",
|
|
83
|
+
onUnsafe: "block",
|
|
84
|
+
onUnknown: "escalate_human",
|
|
85
|
+
timeout_ms: 5000,
|
|
86
|
+
skillLoopStrict: true,
|
|
87
|
+
},
|
|
88
|
+
Institutionnel: {
|
|
89
|
+
onSafe: "proceed",
|
|
90
|
+
onUnsafe: "block",
|
|
91
|
+
onUnknown: "escalate_human",
|
|
92
|
+
timeout_ms: 10_000,
|
|
93
|
+
skillLoopStrict: true,
|
|
94
|
+
},
|
|
95
|
+
SOTA: {
|
|
96
|
+
onSafe: "proceed",
|
|
97
|
+
onUnsafe: "escalate_human",
|
|
98
|
+
onUnknown: "proceed_with_audit_log",
|
|
99
|
+
timeout_ms: 2000,
|
|
100
|
+
skillLoopStrict: true,
|
|
101
|
+
},
|
|
102
|
+
AntiFragile: {
|
|
103
|
+
onSafe: "proceed",
|
|
104
|
+
onUnsafe: "escalate_human",
|
|
105
|
+
onUnknown: "proceed_with_log",
|
|
106
|
+
timeout_ms: 1000,
|
|
107
|
+
skillLoopStrict: true,
|
|
108
|
+
},
|
|
109
|
+
Profitable: {
|
|
110
|
+
onSafe: "proceed",
|
|
111
|
+
onUnsafe: "escalate_human",
|
|
112
|
+
onUnknown: "proceed_with_log",
|
|
113
|
+
timeout_ms: 1000,
|
|
114
|
+
skillLoopStrict: true,
|
|
115
|
+
},
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Consumer-level mode for the formal verifier.
|
|
120
|
+
*
|
|
121
|
+
* `strict` : enforce all policies as declared
|
|
122
|
+
* `permissive` : downgrade non-critical UNSAFE to log (Robuste/Institutionnel
|
|
123
|
+
* remain enforced), and treat UNKNOWN as SKIPPED
|
|
124
|
+
* `audit_only` : never block ; map every actionable outcome to `log`
|
|
125
|
+
*/
|
|
126
|
+
export type ConsumerMode = "strict" | "permissive" | "audit_only";
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Calling context — distinguishes between live runtime verification and
|
|
130
|
+
* skill-loop ingestion. The latter has stricter rules on UNKNOWN.
|
|
131
|
+
*/
|
|
132
|
+
export type VerifyContext = "runtime" | "skill_ingestion";
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Resolution outcome of {@link applyPolicy}.
|
|
136
|
+
*/
|
|
137
|
+
export interface PolicyDecision {
|
|
138
|
+
action: PolicyAction;
|
|
139
|
+
rationale: string;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Whether an axiom is in the "hard" set (Robuste, Institutionnel) whose
|
|
144
|
+
* UNSAFE outcomes are non-negotiable.
|
|
145
|
+
*/
|
|
146
|
+
function isHardAxiom(axiom: string): boolean {
|
|
147
|
+
return axiom === "Robuste" || axiom === "Institutionnel";
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Apply the policy + mode + context to a single verification result.
|
|
152
|
+
*
|
|
153
|
+
* Decision order :
|
|
154
|
+
* 1. SKIPPED → log
|
|
155
|
+
* 2. skill_ingestion + UNKNOWN → block (Tension Sprint C)
|
|
156
|
+
* 3. mode = audit_only → log
|
|
157
|
+
* 4. mode = permissive + UNKNOWN → log (treated as SKIPPED)
|
|
158
|
+
* 5. mode = permissive + UNSAFE + non-hard axiom → log
|
|
159
|
+
* 6. otherwise → policy.on{Safe,Unsafe,Unknown}
|
|
160
|
+
*/
|
|
161
|
+
export function applyPolicy(
|
|
162
|
+
result: FormalVerifyResult,
|
|
163
|
+
policy: AxiomPolicy,
|
|
164
|
+
mode: ConsumerMode,
|
|
165
|
+
context: VerifyContext
|
|
166
|
+
): PolicyDecision {
|
|
167
|
+
// 1. SKIPPED → log
|
|
168
|
+
if (result.state === "SKIPPED") {
|
|
169
|
+
return {
|
|
170
|
+
action: "log",
|
|
171
|
+
rationale: `Axiom ${result.axiom} verification was skipped (${result.rationale})`,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// 2. Tension Sprint C : skill_ingestion + UNKNOWN → block, always.
|
|
176
|
+
if (context === "skill_ingestion" && result.state === "UNKNOWN") {
|
|
177
|
+
return {
|
|
178
|
+
action: "block",
|
|
179
|
+
rationale:
|
|
180
|
+
`Skill ingestion refuses UNKNOWN on axiom ${result.axiom} ` +
|
|
181
|
+
`(Tension Sprint C : skill-loop is always strict on UNKNOWN)`,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// 3. audit_only never blocks.
|
|
186
|
+
if (mode === "audit_only") {
|
|
187
|
+
return {
|
|
188
|
+
action: "log",
|
|
189
|
+
rationale: `audit_only mode : axiom ${result.axiom} = ${result.state}`,
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// SAFE is always proceed.
|
|
194
|
+
if (result.state === "SAFE") {
|
|
195
|
+
return {
|
|
196
|
+
action: "proceed",
|
|
197
|
+
rationale: `Axiom ${result.axiom} proved SAFE in ${result.time_ms.toFixed(
|
|
198
|
+
0
|
|
199
|
+
)}ms`,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// 4 + 5. Permissive softening.
|
|
204
|
+
if (mode === "permissive") {
|
|
205
|
+
if (result.state === "UNKNOWN") {
|
|
206
|
+
return {
|
|
207
|
+
action: "log",
|
|
208
|
+
rationale:
|
|
209
|
+
`permissive mode : UNKNOWN on axiom ${result.axiom} treated as ` +
|
|
210
|
+
`non-blocking (${result.rationale})`,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
if (result.state === "UNSAFE" && !isHardAxiom(result.axiom)) {
|
|
214
|
+
return {
|
|
215
|
+
action: "log",
|
|
216
|
+
rationale:
|
|
217
|
+
`permissive mode : UNSAFE on soft axiom ${result.axiom} downgraded ` +
|
|
218
|
+
`to log (${result.rationale})`,
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
// UNSAFE on hard axiom : fall through to strict policy.
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// 6. Strict policy resolution.
|
|
225
|
+
if (result.state === "UNSAFE") {
|
|
226
|
+
return {
|
|
227
|
+
action: policy.onUnsafe,
|
|
228
|
+
rationale:
|
|
229
|
+
`UNSAFE on axiom ${result.axiom} : ${policy.onUnsafe} ` +
|
|
230
|
+
`(counterexample : ${result.counterexample ?? "n/a"})`,
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// result.state === "UNKNOWN" (runtime context only)
|
|
235
|
+
switch (policy.onUnknown) {
|
|
236
|
+
case "escalate_human":
|
|
237
|
+
return {
|
|
238
|
+
action: "escalate_human",
|
|
239
|
+
rationale: `UNKNOWN on axiom ${result.axiom} : escalating (${result.rationale})`,
|
|
240
|
+
};
|
|
241
|
+
case "proceed_with_audit_log":
|
|
242
|
+
return {
|
|
243
|
+
action: "log",
|
|
244
|
+
rationale: `UNKNOWN on axiom ${result.axiom} : audit-log proceed (${result.rationale})`,
|
|
245
|
+
};
|
|
246
|
+
case "proceed_with_log":
|
|
247
|
+
default:
|
|
248
|
+
return {
|
|
249
|
+
action: "log",
|
|
250
|
+
rationale: `UNKNOWN on axiom ${result.axiom} : log-proceed (${result.rationale})`,
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/verify/formal/result.ts
|
|
3
|
+
*
|
|
4
|
+
* Sprint-587 — Z3 formal verification result type.
|
|
5
|
+
*
|
|
6
|
+
* 4-state result discipline:
|
|
7
|
+
* - SAFE : Z3 proved the post-conditions hold under pre-conditions
|
|
8
|
+
* - UNSAFE : Z3 found a counterexample (state where pre-conditions hold
|
|
9
|
+
* but post-conditions are violated)
|
|
10
|
+
* - UNKNOWN : Z3 returned `unknown` (timeout, undecidable, or solver
|
|
11
|
+
* limitation). EXPLICIT — never silently treated as SAFE.
|
|
12
|
+
* - SKIPPED : Verification not run (consumer mode = permissive opt-out,
|
|
13
|
+
* or solver binary unavailable when caller chooses to skip)
|
|
14
|
+
*
|
|
15
|
+
* The distinction between UNKNOWN and SAFE is the core epistemic discipline
|
|
16
|
+
* of this module : we never assert proof when none was produced.
|
|
17
|
+
*
|
|
18
|
+
* @module verify/formal/result
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Discriminated state of a formal verification attempt.
|
|
23
|
+
*/
|
|
24
|
+
export type FormalVerifyState = "SAFE" | "UNSAFE" | "UNKNOWN" | "SKIPPED";
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Solver backend identifier — currently only Z3 or `none` (no solver).
|
|
28
|
+
*/
|
|
29
|
+
export type FormalSolver = "z3" | "none";
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Result of running a single axiom spec through the formal verifier.
|
|
33
|
+
*
|
|
34
|
+
* `state` : 4-state outcome (see {@link FormalVerifyState})
|
|
35
|
+
* `axiom` : human-readable axiom label (e.g. "Robuste")
|
|
36
|
+
* `rationale` : human-readable explanation of the outcome
|
|
37
|
+
* `witness` : when SAFE, optional UNSAT-core or proof witness string
|
|
38
|
+
* emitted by the solver (informational only)
|
|
39
|
+
* `counterexample` : when UNSAFE, SMT model (variable assignment) that
|
|
40
|
+
* violates the post-conditions
|
|
41
|
+
* `time_ms` : wall-clock time spent in the solver, in milliseconds
|
|
42
|
+
* `solver` : which backend produced the result
|
|
43
|
+
*/
|
|
44
|
+
export interface FormalVerifyResult {
|
|
45
|
+
state: FormalVerifyState;
|
|
46
|
+
axiom: string;
|
|
47
|
+
rationale: string;
|
|
48
|
+
witness?: string;
|
|
49
|
+
counterexample?: string;
|
|
50
|
+
time_ms: number;
|
|
51
|
+
solver: FormalSolver;
|
|
52
|
+
}
|