@adammcarter/use-cases 0.1.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/.agents/skills/migration/SKILL.md +85 -0
- package/.agents/skills/showcase/SKILL.md +60 -0
- package/.agents/skills/use-cases/SKILL.md +161 -0
- package/.agents/skills/walkthrough/SKILL.md +48 -0
- package/.claude-plugin/plugin.json +14 -0
- package/.codex-plugin/plugin.json +33 -0
- package/.mcp.json +8 -0
- package/.opencode/plugin/use-cases.js +32 -0
- package/CHANGELOG.md +125 -0
- package/LICENSE +21 -0
- package/README.md +112 -0
- package/bootstrap/use-cases.md +60 -0
- package/docs/README.md +51 -0
- package/docs/acceptance.md +16 -0
- package/docs/activation.md +89 -0
- package/docs/adr/0001-p0-bootstrap-decisions.md +107 -0
- package/docs/adr/0002-p1-schema-contracts.md +136 -0
- package/docs/adr/0003-p2-use-case-matrix-contracts.md +67 -0
- package/docs/adr/0004-p3-evidence-ledger-contracts.md +85 -0
- package/docs/adr/0005-p4-cli-contract.md +70 -0
- package/docs/adr/0006-trusted-user-approval-path.md +125 -0
- package/docs/cli.md +108 -0
- package/docs/data-model.md +56 -0
- package/docs/getting-started.md +296 -0
- package/docs/hosts.md +30 -0
- package/docs/markers-adoption.md +100 -0
- package/docs/mcp.md +114 -0
- package/docs/migration.md +90 -0
- package/docs/reference/error-codes.md +123 -0
- package/docs/reference/stability.md +123 -0
- package/docs/release.md +26 -0
- package/docs/security/ci-hardening.md +144 -0
- package/docs/security/key-management.md +158 -0
- package/docs/security.md +66 -0
- package/docs/showcase.md +39 -0
- package/docs/tutorials/python-pytest.md +188 -0
- package/examples/basic-product/demo-capsules/product-search.yml +23 -0
- package/examples/basic-product/evidence/by-id/ev/evidence-basic-search.jsonl +1 -0
- package/examples/basic-product/showcase-runs/run.basic.product.search/events.jsonl +4 -0
- package/examples/basic-product/use-cases/product.yml +85 -0
- package/examples/basic-product/use-cases.yml +9 -0
- package/examples/damaged-product/evidence/broken.jsonl +1 -0
- package/examples/damaged-product/use-cases/duplicate-a.yml +28 -0
- package/examples/damaged-product/use-cases/duplicate-b.yml +28 -0
- package/examples/damaged-product/use-cases/malformed.yml +14 -0
- package/examples/damaged-product/use-cases/valid-sibling.yml +28 -0
- package/examples/damaged-product/use-cases.yml +9 -0
- package/examples/host-projections/use-cases.yml +9 -0
- package/examples/python-pytest/README.md +39 -0
- package/examples/python-pytest/pytest.ini +8 -0
- package/examples/python-pytest/src/coupon.py +32 -0
- package/examples/python-pytest/tests/use_cases/example.checkout.apply_coupon_test.py +31 -0
- package/examples/python-pytest/use-cases/checkout.yml +47 -0
- package/examples/python-pytest/use-cases.yml +19 -0
- package/hooks/hooks-codex.json +16 -0
- package/hooks/hooks.json +16 -0
- package/hooks/session-start +42 -0
- package/hosts/claude.yml +29 -0
- package/hosts/codex.yml +29 -0
- package/hosts/copilot.yml +29 -0
- package/hosts/opencode.yml +29 -0
- package/package.json +81 -0
- package/packages/cli/README.md +37 -0
- package/packages/cli/dist/args/parse.d.ts +6 -0
- package/packages/cli/dist/args/parse.d.ts.map +1 -0
- package/packages/cli/dist/args/parse.js +55 -0
- package/packages/cli/dist/args/parse.js.map +1 -0
- package/packages/cli/dist/args/validate.d.ts +3 -0
- package/packages/cli/dist/args/validate.d.ts.map +1 -0
- package/packages/cli/dist/args/validate.js +80 -0
- package/packages/cli/dist/args/validate.js.map +1 -0
- package/packages/cli/dist/builtins.d.ts +2 -0
- package/packages/cli/dist/builtins.d.ts.map +1 -0
- package/packages/cli/dist/builtins.js +235 -0
- package/packages/cli/dist/builtins.js.map +1 -0
- package/packages/cli/dist/command/dispatch.d.ts +4 -0
- package/packages/cli/dist/command/dispatch.d.ts.map +1 -0
- package/packages/cli/dist/command/dispatch.js +45 -0
- package/packages/cli/dist/command/dispatch.js.map +1 -0
- package/packages/cli/dist/command/help-catalog.d.ts +13 -0
- package/packages/cli/dist/command/help-catalog.d.ts.map +1 -0
- package/packages/cli/dist/command/help-catalog.js +42 -0
- package/packages/cli/dist/command/help-catalog.js.map +1 -0
- package/packages/cli/dist/command/registry.d.ts +3 -0
- package/packages/cli/dist/command/registry.d.ts.map +1 -0
- package/packages/cli/dist/command/registry.js +33 -0
- package/packages/cli/dist/command/registry.js.map +1 -0
- package/packages/cli/dist/command/types.d.ts +32 -0
- package/packages/cli/dist/command/types.d.ts.map +1 -0
- package/packages/cli/dist/command/types.js +6 -0
- package/packages/cli/dist/command/types.js.map +1 -0
- package/packages/cli/dist/commands/capsule.d.ts +7 -0
- package/packages/cli/dist/commands/capsule.d.ts.map +1 -0
- package/packages/cli/dist/commands/capsule.js +178 -0
- package/packages/cli/dist/commands/capsule.js.map +1 -0
- package/packages/cli/dist/commands/common.d.ts +7 -0
- package/packages/cli/dist/commands/common.d.ts.map +1 -0
- package/packages/cli/dist/commands/common.js +32 -0
- package/packages/cli/dist/commands/common.js.map +1 -0
- package/packages/cli/dist/commands/doctor.d.ts +6 -0
- package/packages/cli/dist/commands/doctor.d.ts.map +1 -0
- package/packages/cli/dist/commands/doctor.js +133 -0
- package/packages/cli/dist/commands/doctor.js.map +1 -0
- package/packages/cli/dist/commands/evidence.d.ts +6 -0
- package/packages/cli/dist/commands/evidence.d.ts.map +1 -0
- package/packages/cli/dist/commands/evidence.js +191 -0
- package/packages/cli/dist/commands/evidence.js.map +1 -0
- package/packages/cli/dist/commands/host.d.ts +6 -0
- package/packages/cli/dist/commands/host.d.ts.map +1 -0
- package/packages/cli/dist/commands/host.js +180 -0
- package/packages/cli/dist/commands/host.js.map +1 -0
- package/packages/cli/dist/commands/keygen.d.ts +4 -0
- package/packages/cli/dist/commands/keygen.d.ts.map +1 -0
- package/packages/cli/dist/commands/keygen.js +132 -0
- package/packages/cli/dist/commands/keygen.js.map +1 -0
- package/packages/cli/dist/commands/markers.d.ts +8 -0
- package/packages/cli/dist/commands/markers.d.ts.map +1 -0
- package/packages/cli/dist/commands/markers.js +455 -0
- package/packages/cli/dist/commands/markers.js.map +1 -0
- package/packages/cli/dist/commands/matrix.d.ts +8 -0
- package/packages/cli/dist/commands/matrix.d.ts.map +1 -0
- package/packages/cli/dist/commands/matrix.js +237 -0
- package/packages/cli/dist/commands/matrix.js.map +1 -0
- package/packages/cli/dist/commands/migrate.d.ts +4 -0
- package/packages/cli/dist/commands/migrate.d.ts.map +1 -0
- package/packages/cli/dist/commands/migrate.js +82 -0
- package/packages/cli/dist/commands/migrate.js.map +1 -0
- package/packages/cli/dist/commands/plan.d.ts +6 -0
- package/packages/cli/dist/commands/plan.d.ts.map +1 -0
- package/packages/cli/dist/commands/plan.js +129 -0
- package/packages/cli/dist/commands/plan.js.map +1 -0
- package/packages/cli/dist/commands/recover.d.ts +4 -0
- package/packages/cli/dist/commands/recover.d.ts.map +1 -0
- package/packages/cli/dist/commands/recover.js +352 -0
- package/packages/cli/dist/commands/recover.js.map +1 -0
- package/packages/cli/dist/commands/schema.d.ts +5 -0
- package/packages/cli/dist/commands/schema.d.ts.map +1 -0
- package/packages/cli/dist/commands/schema.js +51 -0
- package/packages/cli/dist/commands/schema.js.map +1 -0
- package/packages/cli/dist/commands/showcase.d.ts +14 -0
- package/packages/cli/dist/commands/showcase.d.ts.map +1 -0
- package/packages/cli/dist/commands/showcase.js +638 -0
- package/packages/cli/dist/commands/showcase.js.map +1 -0
- package/packages/cli/dist/commands/workflow.d.ts +5 -0
- package/packages/cli/dist/commands/workflow.d.ts.map +1 -0
- package/packages/cli/dist/commands/workflow.js +107 -0
- package/packages/cli/dist/commands/workflow.js.map +1 -0
- package/packages/cli/dist/coreLoader.d.ts +6 -0
- package/packages/cli/dist/coreLoader.d.ts.map +1 -0
- package/packages/cli/dist/coreLoader.js +34 -0
- package/packages/cli/dist/coreLoader.js.map +1 -0
- package/packages/cli/dist/index.d.ts +5 -0
- package/packages/cli/dist/index.d.ts.map +1 -0
- package/packages/cli/dist/index.js +83 -0
- package/packages/cli/dist/index.js.map +1 -0
- package/packages/cli/dist/render.d.ts +2 -0
- package/packages/cli/dist/render.d.ts.map +1 -0
- package/packages/cli/dist/render.js +88 -0
- package/packages/cli/dist/render.js.map +1 -0
- package/packages/cli/dist/runtime.d.ts +25 -0
- package/packages/cli/dist/runtime.d.ts.map +1 -0
- package/packages/cli/dist/runtime.js +89 -0
- package/packages/cli/dist/runtime.js.map +1 -0
- package/packages/cli/package.json +38 -0
- package/packages/core/README.md +37 -0
- package/packages/core/dist/capsules/index.d.ts +4 -0
- package/packages/core/dist/capsules/index.d.ts.map +1 -0
- package/packages/core/dist/capsules/index.js +4 -0
- package/packages/core/dist/capsules/index.js.map +1 -0
- package/packages/core/dist/capsules/loadCapsule.d.ts +11 -0
- package/packages/core/dist/capsules/loadCapsule.d.ts.map +1 -0
- package/packages/core/dist/capsules/loadCapsule.js +167 -0
- package/packages/core/dist/capsules/loadCapsule.js.map +1 -0
- package/packages/core/dist/capsules/runCapsule.d.ts +3 -0
- package/packages/core/dist/capsules/runCapsule.d.ts.map +1 -0
- package/packages/core/dist/capsules/runCapsule.js +333 -0
- package/packages/core/dist/capsules/runCapsule.js.map +1 -0
- package/packages/core/dist/capsules/types.d.ts +106 -0
- package/packages/core/dist/capsules/types.d.ts.map +1 -0
- package/packages/core/dist/capsules/types.js +2 -0
- package/packages/core/dist/capsules/types.js.map +1 -0
- package/packages/core/dist/durableWrite.d.ts +2 -0
- package/packages/core/dist/durableWrite.d.ts.map +1 -0
- package/packages/core/dist/durableWrite.js +34 -0
- package/packages/core/dist/durableWrite.js.map +1 -0
- package/packages/core/dist/errors/registry.d.ts +122 -0
- package/packages/core/dist/errors/registry.d.ts.map +1 -0
- package/packages/core/dist/errors/registry.js +206 -0
- package/packages/core/dist/errors/registry.js.map +1 -0
- package/packages/core/dist/errors/render.d.ts +3 -0
- package/packages/core/dist/errors/render.d.ts.map +1 -0
- package/packages/core/dist/errors/render.js +64 -0
- package/packages/core/dist/errors/render.js.map +1 -0
- package/packages/core/dist/errors.d.ts +5 -0
- package/packages/core/dist/errors.d.ts.map +1 -0
- package/packages/core/dist/errors.js +9 -0
- package/packages/core/dist/errors.js.map +1 -0
- package/packages/core/dist/evidence/appendEvidenceEvent.d.ts +27 -0
- package/packages/core/dist/evidence/appendEvidenceEvent.d.ts.map +1 -0
- package/packages/core/dist/evidence/appendEvidenceEvent.js +218 -0
- package/packages/core/dist/evidence/appendEvidenceEvent.js.map +1 -0
- package/packages/core/dist/evidence/assurance.d.ts +18 -0
- package/packages/core/dist/evidence/assurance.d.ts.map +1 -0
- package/packages/core/dist/evidence/assurance.js +38 -0
- package/packages/core/dist/evidence/assurance.js.map +1 -0
- package/packages/core/dist/evidence/index.d.ts +8 -0
- package/packages/core/dist/evidence/index.d.ts.map +1 -0
- package/packages/core/dist/evidence/index.js +8 -0
- package/packages/core/dist/evidence/index.js.map +1 -0
- package/packages/core/dist/evidence/jsonlLedger.d.ts +13 -0
- package/packages/core/dist/evidence/jsonlLedger.d.ts.map +1 -0
- package/packages/core/dist/evidence/jsonlLedger.js +171 -0
- package/packages/core/dist/evidence/jsonlLedger.js.map +1 -0
- package/packages/core/dist/evidence/linkEvidence.d.ts +4 -0
- package/packages/core/dist/evidence/linkEvidence.d.ts.map +1 -0
- package/packages/core/dist/evidence/linkEvidence.js +53 -0
- package/packages/core/dist/evidence/linkEvidence.js.map +1 -0
- package/packages/core/dist/evidence/replayEvidence.d.ts +6 -0
- package/packages/core/dist/evidence/replayEvidence.d.ts.map +1 -0
- package/packages/core/dist/evidence/replayEvidence.js +216 -0
- package/packages/core/dist/evidence/replayEvidence.js.map +1 -0
- package/packages/core/dist/evidence/results.d.ts +4 -0
- package/packages/core/dist/evidence/results.d.ts.map +1 -0
- package/packages/core/dist/evidence/results.js +32 -0
- package/packages/core/dist/evidence/results.js.map +1 -0
- package/packages/core/dist/evidence/types.d.ts +149 -0
- package/packages/core/dist/evidence/types.d.ts.map +1 -0
- package/packages/core/dist/evidence/types.js +2 -0
- package/packages/core/dist/evidence/types.js.map +1 -0
- package/packages/core/dist/host-profiles/claude.yml +29 -0
- package/packages/core/dist/host-profiles/codex.yml +29 -0
- package/packages/core/dist/host-profiles/copilot.yml +29 -0
- package/packages/core/dist/host-profiles/opencode.yml +29 -0
- package/packages/core/dist/hosts/conformanceStatus.d.ts +16 -0
- package/packages/core/dist/hosts/conformanceStatus.d.ts.map +1 -0
- package/packages/core/dist/hosts/conformanceStatus.js +160 -0
- package/packages/core/dist/hosts/conformanceStatus.js.map +1 -0
- package/packages/core/dist/hosts/index.d.ts +5 -0
- package/packages/core/dist/hosts/index.d.ts.map +1 -0
- package/packages/core/dist/hosts/index.js +5 -0
- package/packages/core/dist/hosts/index.js.map +1 -0
- package/packages/core/dist/hosts/loadHostProfile.d.ts +6 -0
- package/packages/core/dist/hosts/loadHostProfile.d.ts.map +1 -0
- package/packages/core/dist/hosts/loadHostProfile.js +41 -0
- package/packages/core/dist/hosts/loadHostProfile.js.map +1 -0
- package/packages/core/dist/hosts/projectHostFiles.d.ts +16 -0
- package/packages/core/dist/hosts/projectHostFiles.d.ts.map +1 -0
- package/packages/core/dist/hosts/projectHostFiles.js +272 -0
- package/packages/core/dist/hosts/projectHostFiles.js.map +1 -0
- package/packages/core/dist/hosts/types.d.ts +122 -0
- package/packages/core/dist/hosts/types.d.ts.map +1 -0
- package/packages/core/dist/hosts/types.js +2 -0
- package/packages/core/dist/hosts/types.js.map +1 -0
- package/packages/core/dist/index.d.ts +26 -0
- package/packages/core/dist/index.d.ts.map +1 -0
- package/packages/core/dist/index.js +31 -0
- package/packages/core/dist/index.js.map +1 -0
- package/packages/core/dist/init/index.d.ts +2 -0
- package/packages/core/dist/init/index.d.ts.map +1 -0
- package/packages/core/dist/init/index.js +3 -0
- package/packages/core/dist/init/index.js.map +1 -0
- package/packages/core/dist/init/scaffold.d.ts +28 -0
- package/packages/core/dist/init/scaffold.d.ts.map +1 -0
- package/packages/core/dist/init/scaffold.js +293 -0
- package/packages/core/dist/init/scaffold.js.map +1 -0
- package/packages/core/dist/markers/appendOnly.d.ts +23 -0
- package/packages/core/dist/markers/appendOnly.d.ts.map +1 -0
- package/packages/core/dist/markers/appendOnly.js +75 -0
- package/packages/core/dist/markers/appendOnly.js.map +1 -0
- package/packages/core/dist/markers/bindingSetHash.d.ts +28 -0
- package/packages/core/dist/markers/bindingSetHash.d.ts.map +1 -0
- package/packages/core/dist/markers/bindingSetHash.js +33 -0
- package/packages/core/dist/markers/bindingSetHash.js.map +1 -0
- package/packages/core/dist/markers/canonicalJson.d.ts +4 -0
- package/packages/core/dist/markers/canonicalJson.d.ts.map +1 -0
- package/packages/core/dist/markers/canonicalJson.js +51 -0
- package/packages/core/dist/markers/canonicalJson.js.map +1 -0
- package/packages/core/dist/markers/ciAuthority.d.ts +17 -0
- package/packages/core/dist/markers/ciAuthority.d.ts.map +1 -0
- package/packages/core/dist/markers/ciAuthority.js +131 -0
- package/packages/core/dist/markers/ciAuthority.js.map +1 -0
- package/packages/core/dist/markers/cli/bind.d.ts +48 -0
- package/packages/core/dist/markers/cli/bind.d.ts.map +1 -0
- package/packages/core/dist/markers/cli/bind.js +198 -0
- package/packages/core/dist/markers/cli/bind.js.map +1 -0
- package/packages/core/dist/markers/cli/index.d.ts +9 -0
- package/packages/core/dist/markers/cli/index.d.ts.map +1 -0
- package/packages/core/dist/markers/cli/index.js +15 -0
- package/packages/core/dist/markers/cli/index.js.map +1 -0
- package/packages/core/dist/markers/cli/io.d.ts +18 -0
- package/packages/core/dist/markers/cli/io.d.ts.map +1 -0
- package/packages/core/dist/markers/cli/io.js +62 -0
- package/packages/core/dist/markers/cli/io.js.map +1 -0
- package/packages/core/dist/markers/cli/precommit.d.ts +32 -0
- package/packages/core/dist/markers/cli/precommit.d.ts.map +1 -0
- package/packages/core/dist/markers/cli/precommit.js +174 -0
- package/packages/core/dist/markers/cli/precommit.js.map +1 -0
- package/packages/core/dist/markers/cli/prove.d.ts +69 -0
- package/packages/core/dist/markers/cli/prove.d.ts.map +1 -0
- package/packages/core/dist/markers/cli/prove.js +381 -0
- package/packages/core/dist/markers/cli/prove.js.map +1 -0
- package/packages/core/dist/markers/cli/scan.d.ts +63 -0
- package/packages/core/dist/markers/cli/scan.d.ts.map +1 -0
- package/packages/core/dist/markers/cli/scan.js +233 -0
- package/packages/core/dist/markers/cli/scan.js.map +1 -0
- package/packages/core/dist/markers/cli/shared.d.ts +25 -0
- package/packages/core/dist/markers/cli/shared.d.ts.map +1 -0
- package/packages/core/dist/markers/cli/shared.js +123 -0
- package/packages/core/dist/markers/cli/shared.js.map +1 -0
- package/packages/core/dist/markers/cli/validateLedger.d.ts +38 -0
- package/packages/core/dist/markers/cli/validateLedger.d.ts.map +1 -0
- package/packages/core/dist/markers/cli/validateLedger.js +81 -0
- package/packages/core/dist/markers/cli/validateLedger.js.map +1 -0
- package/packages/core/dist/markers/cli/verify.d.ts +65 -0
- package/packages/core/dist/markers/cli/verify.d.ts.map +1 -0
- package/packages/core/dist/markers/cli/verify.js +245 -0
- package/packages/core/dist/markers/cli/verify.js.map +1 -0
- package/packages/core/dist/markers/commentPrefix.d.ts +7 -0
- package/packages/core/dist/markers/commentPrefix.d.ts.map +1 -0
- package/packages/core/dist/markers/commentPrefix.js +79 -0
- package/packages/core/dist/markers/commentPrefix.js.map +1 -0
- package/packages/core/dist/markers/constants.d.ts +10 -0
- package/packages/core/dist/markers/constants.d.ts.map +1 -0
- package/packages/core/dist/markers/constants.js +13 -0
- package/packages/core/dist/markers/constants.js.map +1 -0
- package/packages/core/dist/markers/evidenceLedger.d.ts +150 -0
- package/packages/core/dist/markers/evidenceLedger.d.ts.map +1 -0
- package/packages/core/dist/markers/evidenceLedger.js +391 -0
- package/packages/core/dist/markers/evidenceLedger.js.map +1 -0
- package/packages/core/dist/markers/freshness.d.ts +125 -0
- package/packages/core/dist/markers/freshness.d.ts.map +1 -0
- package/packages/core/dist/markers/freshness.js +605 -0
- package/packages/core/dist/markers/freshness.js.map +1 -0
- package/packages/core/dist/markers/index.d.ts +26 -0
- package/packages/core/dist/markers/index.d.ts.map +1 -0
- package/packages/core/dist/markers/index.js +38 -0
- package/packages/core/dist/markers/index.js.map +1 -0
- package/packages/core/dist/markers/keygen.d.ts +6 -0
- package/packages/core/dist/markers/keygen.d.ts.map +1 -0
- package/packages/core/dist/markers/keygen.js +18 -0
- package/packages/core/dist/markers/keygen.js.map +1 -0
- package/packages/core/dist/markers/keyring.d.ts +23 -0
- package/packages/core/dist/markers/keyring.d.ts.map +1 -0
- package/packages/core/dist/markers/keyring.js +93 -0
- package/packages/core/dist/markers/keyring.js.map +1 -0
- package/packages/core/dist/markers/markerLine.d.ts +35 -0
- package/packages/core/dist/markers/markerLine.d.ts.map +1 -0
- package/packages/core/dist/markers/markerLine.js +125 -0
- package/packages/core/dist/markers/markerLine.js.map +1 -0
- package/packages/core/dist/markers/physicalLines.d.ts +10 -0
- package/packages/core/dist/markers/physicalLines.d.ts.map +1 -0
- package/packages/core/dist/markers/physicalLines.js +48 -0
- package/packages/core/dist/markers/physicalLines.js.map +1 -0
- package/packages/core/dist/markers/policyHash.d.ts +4 -0
- package/packages/core/dist/markers/policyHash.d.ts.map +1 -0
- package/packages/core/dist/markers/policyHash.js +14 -0
- package/packages/core/dist/markers/policyHash.js.map +1 -0
- package/packages/core/dist/markers/proofSignature.d.ts +29 -0
- package/packages/core/dist/markers/proofSignature.d.ts.map +1 -0
- package/packages/core/dist/markers/proofSignature.js +106 -0
- package/packages/core/dist/markers/proofSignature.js.map +1 -0
- package/packages/core/dist/markers/reconcile.d.ts +26 -0
- package/packages/core/dist/markers/reconcile.d.ts.map +1 -0
- package/packages/core/dist/markers/reconcile.js +52 -0
- package/packages/core/dist/markers/reconcile.js.map +1 -0
- package/packages/core/dist/markers/registry.d.ts +53 -0
- package/packages/core/dist/markers/registry.d.ts.map +1 -0
- package/packages/core/dist/markers/registry.js +161 -0
- package/packages/core/dist/markers/registry.js.map +1 -0
- package/packages/core/dist/markers/rowHash.d.ts +2 -0
- package/packages/core/dist/markers/rowHash.d.ts.map +1 -0
- package/packages/core/dist/markers/rowHash.js +10 -0
- package/packages/core/dist/markers/rowHash.js.map +1 -0
- package/packages/core/dist/markers/scanner.d.ts +67 -0
- package/packages/core/dist/markers/scanner.d.ts.map +1 -0
- package/packages/core/dist/markers/scanner.js +292 -0
- package/packages/core/dist/markers/scanner.js.map +1 -0
- package/packages/core/dist/markers/schemas/binding-registry-event.schema.json +41 -0
- package/packages/core/dist/markers/schemas/freshness-status.schema.json +134 -0
- package/packages/core/dist/markers/schemas/proof-event.schema.json +170 -0
- package/packages/core/dist/markers/spanCanon.d.ts +4 -0
- package/packages/core/dist/markers/spanCanon.d.ts.map +1 -0
- package/packages/core/dist/markers/spanCanon.js +42 -0
- package/packages/core/dist/markers/spanCanon.js.map +1 -0
- package/packages/core/dist/markers/swiftFuncRecognizer.d.ts +36 -0
- package/packages/core/dist/markers/swiftFuncRecognizer.d.ts.map +1 -0
- package/packages/core/dist/markers/swiftFuncRecognizer.js +638 -0
- package/packages/core/dist/markers/swiftFuncRecognizer.js.map +1 -0
- package/packages/core/dist/markers/validators.d.ts +13 -0
- package/packages/core/dist/markers/validators.d.ts.map +1 -0
- package/packages/core/dist/markers/validators.js +64 -0
- package/packages/core/dist/markers/validators.js.map +1 -0
- package/packages/core/dist/markers/verificationContextHash.d.ts +23 -0
- package/packages/core/dist/markers/verificationContextHash.d.ts.map +1 -0
- package/packages/core/dist/markers/verificationContextHash.js +96 -0
- package/packages/core/dist/markers/verificationContextHash.js.map +1 -0
- package/packages/core/dist/markers/verifierPresets.d.ts +18 -0
- package/packages/core/dist/markers/verifierPresets.d.ts.map +1 -0
- package/packages/core/dist/markers/verifierPresets.js +71 -0
- package/packages/core/dist/markers/verifierPresets.js.map +1 -0
- package/packages/core/dist/markers/verifierResolver.d.ts +27 -0
- package/packages/core/dist/markers/verifierResolver.d.ts.map +1 -0
- package/packages/core/dist/markers/verifierResolver.js +151 -0
- package/packages/core/dist/markers/verifierResolver.js.map +1 -0
- package/packages/core/dist/migration/index.d.ts +2 -0
- package/packages/core/dist/migration/index.d.ts.map +1 -0
- package/packages/core/dist/migration/index.js +2 -0
- package/packages/core/dist/migration/index.js.map +1 -0
- package/packages/core/dist/migration/testMatrix.d.ts +42 -0
- package/packages/core/dist/migration/testMatrix.d.ts.map +1 -0
- package/packages/core/dist/migration/testMatrix.js +351 -0
- package/packages/core/dist/migration/testMatrix.js.map +1 -0
- package/packages/core/dist/package/index.d.ts +2 -0
- package/packages/core/dist/package/index.d.ts.map +1 -0
- package/packages/core/dist/package/index.js +2 -0
- package/packages/core/dist/package/index.js.map +1 -0
- package/packages/core/dist/package/inspectPackage.d.ts +67 -0
- package/packages/core/dist/package/inspectPackage.d.ts.map +1 -0
- package/packages/core/dist/package/inspectPackage.js +371 -0
- package/packages/core/dist/package/inspectPackage.js.map +1 -0
- package/packages/core/dist/presentation/candidates.d.ts +13 -0
- package/packages/core/dist/presentation/candidates.d.ts.map +1 -0
- package/packages/core/dist/presentation/candidates.js +86 -0
- package/packages/core/dist/presentation/candidates.js.map +1 -0
- package/packages/core/dist/presentation/index.d.ts +8 -0
- package/packages/core/dist/presentation/index.d.ts.map +1 -0
- package/packages/core/dist/presentation/index.js +8 -0
- package/packages/core/dist/presentation/index.js.map +1 -0
- package/packages/core/dist/presentation/items.d.ts +18 -0
- package/packages/core/dist/presentation/items.d.ts.map +1 -0
- package/packages/core/dist/presentation/items.js +228 -0
- package/packages/core/dist/presentation/items.js.map +1 -0
- package/packages/core/dist/presentation/ordering.d.ts +8 -0
- package/packages/core/dist/presentation/ordering.d.ts.map +1 -0
- package/packages/core/dist/presentation/ordering.js +31 -0
- package/packages/core/dist/presentation/ordering.js.map +1 -0
- package/packages/core/dist/presentation/planHelpers.d.ts +26 -0
- package/packages/core/dist/presentation/planHelpers.d.ts.map +1 -0
- package/packages/core/dist/presentation/planHelpers.js +62 -0
- package/packages/core/dist/presentation/planHelpers.js.map +1 -0
- package/packages/core/dist/presentation/presentationFormat.d.ts +39 -0
- package/packages/core/dist/presentation/presentationFormat.d.ts.map +1 -0
- package/packages/core/dist/presentation/presentationFormat.js +58 -0
- package/packages/core/dist/presentation/presentationFormat.js.map +1 -0
- package/packages/core/dist/presentation/renderCard.d.ts +37 -0
- package/packages/core/dist/presentation/renderCard.d.ts.map +1 -0
- package/packages/core/dist/presentation/renderCard.js +129 -0
- package/packages/core/dist/presentation/renderCard.js.map +1 -0
- package/packages/core/dist/presentation/scoring.d.ts +10 -0
- package/packages/core/dist/presentation/scoring.d.ts.map +1 -0
- package/packages/core/dist/presentation/scoring.js +82 -0
- package/packages/core/dist/presentation/scoring.js.map +1 -0
- package/packages/core/dist/presentation/selectPlan.d.ts +4 -0
- package/packages/core/dist/presentation/selectPlan.d.ts.map +1 -0
- package/packages/core/dist/presentation/selectPlan.js +122 -0
- package/packages/core/dist/presentation/selectPlan.js.map +1 -0
- package/packages/core/dist/presentation/selectShowcasePlan.d.ts +3 -0
- package/packages/core/dist/presentation/selectShowcasePlan.d.ts.map +1 -0
- package/packages/core/dist/presentation/selectShowcasePlan.js +6 -0
- package/packages/core/dist/presentation/selectShowcasePlan.js.map +1 -0
- package/packages/core/dist/presentation/selectWalkthroughPlan.d.ts +3 -0
- package/packages/core/dist/presentation/selectWalkthroughPlan.d.ts.map +1 -0
- package/packages/core/dist/presentation/selectWalkthroughPlan.js +6 -0
- package/packages/core/dist/presentation/selectWalkthroughPlan.js.map +1 -0
- package/packages/core/dist/presentation/selection.d.ts +7 -0
- package/packages/core/dist/presentation/selection.d.ts.map +1 -0
- package/packages/core/dist/presentation/selection.js +20 -0
- package/packages/core/dist/presentation/selection.js.map +1 -0
- package/packages/core/dist/presentation/snapshot.d.ts +12 -0
- package/packages/core/dist/presentation/snapshot.d.ts.map +1 -0
- package/packages/core/dist/presentation/snapshot.js +53 -0
- package/packages/core/dist/presentation/snapshot.js.map +1 -0
- package/packages/core/dist/presentation/types.d.ts +172 -0
- package/packages/core/dist/presentation/types.d.ts.map +1 -0
- package/packages/core/dist/presentation/types.js +2 -0
- package/packages/core/dist/presentation/types.js.map +1 -0
- package/packages/core/dist/redact.d.ts +11 -0
- package/packages/core/dist/redact.d.ts.map +1 -0
- package/packages/core/dist/redact.js +17 -0
- package/packages/core/dist/redact.js.map +1 -0
- package/packages/core/dist/roots.d.ts +81 -0
- package/packages/core/dist/roots.d.ts.map +1 -0
- package/packages/core/dist/roots.js +220 -0
- package/packages/core/dist/roots.js.map +1 -0
- package/packages/core/dist/schema/cliResult.d.ts +34 -0
- package/packages/core/dist/schema/cliResult.d.ts.map +1 -0
- package/packages/core/dist/schema/cliResult.js +35 -0
- package/packages/core/dist/schema/cliResult.js.map +1 -0
- package/packages/core/dist/schema/diagnostic.d.ts +26 -0
- package/packages/core/dist/schema/diagnostic.d.ts.map +1 -0
- package/packages/core/dist/schema/diagnostic.js +28 -0
- package/packages/core/dist/schema/diagnostic.js.map +1 -0
- package/packages/core/dist/schema/index.d.ts +8 -0
- package/packages/core/dist/schema/index.d.ts.map +1 -0
- package/packages/core/dist/schema/index.js +9 -0
- package/packages/core/dist/schema/index.js.map +1 -0
- package/packages/core/dist/schema/registry.d.ts +15 -0
- package/packages/core/dist/schema/registry.d.ts.map +1 -0
- package/packages/core/dist/schema/registry.js +206 -0
- package/packages/core/dist/schema/registry.js.map +1 -0
- package/packages/core/dist/schema/syntheticContracts.d.ts +3 -0
- package/packages/core/dist/schema/syntheticContracts.d.ts.map +1 -0
- package/packages/core/dist/schema/syntheticContracts.js +342 -0
- package/packages/core/dist/schema/syntheticContracts.js.map +1 -0
- package/packages/core/dist/schema/validate.d.ts +21 -0
- package/packages/core/dist/schema/validate.d.ts.map +1 -0
- package/packages/core/dist/schema/validate.js +210 -0
- package/packages/core/dist/schema/validate.js.map +1 -0
- package/packages/core/dist/schemas/v1/authority.schema.json +70 -0
- package/packages/core/dist/schemas/v1/cli-result.schema.json +30 -0
- package/packages/core/dist/schemas/v1/common.schema.json +274 -0
- package/packages/core/dist/schemas/v1/demo-capsule.schema.json +78 -0
- package/packages/core/dist/schemas/v1/evidence-append-result.schema.json +14 -0
- package/packages/core/dist/schemas/v1/evidence-event.schema.json +181 -0
- package/packages/core/dist/schemas/v1/evidence-status-result.schema.json +68 -0
- package/packages/core/dist/schemas/v1/host-profile.schema.json +94 -0
- package/packages/core/dist/schemas/v1/host-status-result.schema.json +49 -0
- package/packages/core/dist/schemas/v1/keyring.schema.json +77 -0
- package/packages/core/dist/schemas/v1/ledger.schema.json +99 -0
- package/packages/core/dist/schemas/v1/marker.schema.json +84 -0
- package/packages/core/dist/schemas/v1/matrix-list-result.schema.json +67 -0
- package/packages/core/dist/schemas/v1/matrix-mutation-result.schema.json +49 -0
- package/packages/core/dist/schemas/v1/matrix-validation-result.schema.json +77 -0
- package/packages/core/dist/schemas/v1/mcp-tool-results.schema.json +34 -0
- package/packages/core/dist/schemas/v1/migration-test-matrix-result.schema.json +76 -0
- package/packages/core/dist/schemas/v1/presentation-plan-result.schema.json +62 -0
- package/packages/core/dist/schemas/v1/presentation-plan.schema.json +259 -0
- package/packages/core/dist/schemas/v1/release-gate-result.schema.json +136 -0
- package/packages/core/dist/schemas/v1/showcase-approval-result.schema.json +5 -0
- package/packages/core/dist/schemas/v1/showcase-event-append-result.schema.json +17 -0
- package/packages/core/dist/schemas/v1/showcase-event.schema.json +235 -0
- package/packages/core/dist/schemas/v1/showcase-finish-result.schema.json +5 -0
- package/packages/core/dist/schemas/v1/showcase-run-status-result.schema.json +70 -0
- package/packages/core/dist/schemas/v1/showcase-start-result.schema.json +5 -0
- package/packages/core/dist/schemas/v1/use-case-file.schema.json +178 -0
- package/packages/core/dist/schemas/v1/workflow-mode.schema.json +16 -0
- package/packages/core/dist/schemas/v1/workspace-config.schema.json +58 -0
- package/packages/core/dist/showcase/appendShowcaseEvent.d.ts +116 -0
- package/packages/core/dist/showcase/appendShowcaseEvent.d.ts.map +1 -0
- package/packages/core/dist/showcase/appendShowcaseEvent.js +353 -0
- package/packages/core/dist/showcase/appendShowcaseEvent.js.map +1 -0
- package/packages/core/dist/showcase/approval.d.ts +2 -0
- package/packages/core/dist/showcase/approval.d.ts.map +1 -0
- package/packages/core/dist/showcase/approval.js +2 -0
- package/packages/core/dist/showcase/approval.js.map +1 -0
- package/packages/core/dist/showcase/approvalAuthority.d.ts +19 -0
- package/packages/core/dist/showcase/approvalAuthority.d.ts.map +1 -0
- package/packages/core/dist/showcase/approvalAuthority.js +46 -0
- package/packages/core/dist/showcase/approvalAuthority.js.map +1 -0
- package/packages/core/dist/showcase/index.d.ts +11 -0
- package/packages/core/dist/showcase/index.d.ts.map +1 -0
- package/packages/core/dist/showcase/index.js +11 -0
- package/packages/core/dist/showcase/index.js.map +1 -0
- package/packages/core/dist/showcase/jsonlLedger.d.ts +11 -0
- package/packages/core/dist/showcase/jsonlLedger.d.ts.map +1 -0
- package/packages/core/dist/showcase/jsonlLedger.js +50 -0
- package/packages/core/dist/showcase/jsonlLedger.js.map +1 -0
- package/packages/core/dist/showcase/planBinding.d.ts +5 -0
- package/packages/core/dist/showcase/planBinding.d.ts.map +1 -0
- package/packages/core/dist/showcase/planBinding.js +33 -0
- package/packages/core/dist/showcase/planBinding.js.map +1 -0
- package/packages/core/dist/showcase/replayRun.d.ts +5 -0
- package/packages/core/dist/showcase/replayRun.d.ts.map +1 -0
- package/packages/core/dist/showcase/replayRun.js +199 -0
- package/packages/core/dist/showcase/replayRun.js.map +1 -0
- package/packages/core/dist/showcase/results.d.ts +3 -0
- package/packages/core/dist/showcase/results.d.ts.map +1 -0
- package/packages/core/dist/showcase/results.js +4 -0
- package/packages/core/dist/showcase/results.js.map +1 -0
- package/packages/core/dist/showcase/revisionEpochs.d.ts +2 -0
- package/packages/core/dist/showcase/revisionEpochs.d.ts.map +1 -0
- package/packages/core/dist/showcase/revisionEpochs.js +2 -0
- package/packages/core/dist/showcase/revisionEpochs.js.map +1 -0
- package/packages/core/dist/showcase/startRun.d.ts +2 -0
- package/packages/core/dist/showcase/startRun.d.ts.map +1 -0
- package/packages/core/dist/showcase/startRun.js +2 -0
- package/packages/core/dist/showcase/startRun.js.map +1 -0
- package/packages/core/dist/showcase/types.d.ts +66 -0
- package/packages/core/dist/showcase/types.d.ts.map +1 -0
- package/packages/core/dist/showcase/types.js +2 -0
- package/packages/core/dist/showcase/types.js.map +1 -0
- package/packages/core/dist/skills/canonicalSkills.d.ts +3 -0
- package/packages/core/dist/skills/canonicalSkills.d.ts.map +1 -0
- package/packages/core/dist/skills/canonicalSkills.js +7 -0
- package/packages/core/dist/skills/canonicalSkills.js.map +1 -0
- package/packages/core/dist/skills/index.d.ts +4 -0
- package/packages/core/dist/skills/index.d.ts.map +1 -0
- package/packages/core/dist/skills/index.js +4 -0
- package/packages/core/dist/skills/index.js.map +1 -0
- package/packages/core/dist/skills/types.d.ts +26 -0
- package/packages/core/dist/skills/types.d.ts.map +1 -0
- package/packages/core/dist/skills/types.js +2 -0
- package/packages/core/dist/skills/types.js.map +1 -0
- package/packages/core/dist/skills/validateSkillAssets.d.ts +6 -0
- package/packages/core/dist/skills/validateSkillAssets.d.ts.map +1 -0
- package/packages/core/dist/skills/validateSkillAssets.js +218 -0
- package/packages/core/dist/skills/validateSkillAssets.js.map +1 -0
- package/packages/core/dist/useCases/integrity.d.ts +11 -0
- package/packages/core/dist/useCases/integrity.d.ts.map +1 -0
- package/packages/core/dist/useCases/integrity.js +178 -0
- package/packages/core/dist/useCases/integrity.js.map +1 -0
- package/packages/core/dist/useCases/loadUseCaseMatrix.d.ts +7 -0
- package/packages/core/dist/useCases/loadUseCaseMatrix.d.ts.map +1 -0
- package/packages/core/dist/useCases/loadUseCaseMatrix.js +74 -0
- package/packages/core/dist/useCases/loadUseCaseMatrix.js.map +1 -0
- package/packages/core/dist/useCases/mutateUseCaseMatrix.d.ts +25 -0
- package/packages/core/dist/useCases/mutateUseCaseMatrix.d.ts.map +1 -0
- package/packages/core/dist/useCases/mutateUseCaseMatrix.js +198 -0
- package/packages/core/dist/useCases/mutateUseCaseMatrix.js.map +1 -0
- package/packages/core/dist/useCases/query.d.ts +12 -0
- package/packages/core/dist/useCases/query.d.ts.map +1 -0
- package/packages/core/dist/useCases/query.js +47 -0
- package/packages/core/dist/useCases/query.js.map +1 -0
- package/packages/core/dist/useCases/types.d.ts +149 -0
- package/packages/core/dist/useCases/types.d.ts.map +1 -0
- package/packages/core/dist/useCases/types.js +2 -0
- package/packages/core/dist/useCases/types.js.map +1 -0
- package/packages/core/dist/useCases/validateUseCaseFile.d.ts +9 -0
- package/packages/core/dist/useCases/validateUseCaseFile.d.ts.map +1 -0
- package/packages/core/dist/useCases/validateUseCaseFile.js +107 -0
- package/packages/core/dist/useCases/validateUseCaseFile.js.map +1 -0
- package/packages/core/dist/version.d.ts +9 -0
- package/packages/core/dist/version.d.ts.map +1 -0
- package/packages/core/dist/version.js +17 -0
- package/packages/core/dist/version.js.map +1 -0
- package/packages/core/package.json +39 -0
- package/packages/mcp/README.md +48 -0
- package/packages/mcp/dist/index.d.ts +20 -0
- package/packages/mcp/dist/index.d.ts.map +1 -0
- package/packages/mcp/dist/index.js +180 -0
- package/packages/mcp/dist/index.js.map +1 -0
- package/packages/mcp/dist/prompts.d.ts +32 -0
- package/packages/mcp/dist/prompts.d.ts.map +1 -0
- package/packages/mcp/dist/prompts.js +199 -0
- package/packages/mcp/dist/prompts.js.map +1 -0
- package/packages/mcp/dist/resources.d.ts +22 -0
- package/packages/mcp/dist/resources.d.ts.map +1 -0
- package/packages/mcp/dist/resources.js +342 -0
- package/packages/mcp/dist/resources.js.map +1 -0
- package/packages/mcp/dist/toolHandlers.d.ts +28 -0
- package/packages/mcp/dist/toolHandlers.d.ts.map +1 -0
- package/packages/mcp/dist/toolHandlers.js +592 -0
- package/packages/mcp/dist/toolHandlers.js.map +1 -0
- package/packages/mcp/dist/toolSchemas.d.ts +23 -0
- package/packages/mcp/dist/toolSchemas.d.ts.map +1 -0
- package/packages/mcp/dist/toolSchemas.js +223 -0
- package/packages/mcp/dist/toolSchemas.js.map +1 -0
- package/packages/mcp/dist/tools.d.ts +22 -0
- package/packages/mcp/dist/tools.d.ts.map +1 -0
- package/packages/mcp/dist/tools.js +65 -0
- package/packages/mcp/dist/tools.js.map +1 -0
- package/packages/mcp/package.json +38 -0
- package/plugin.json +6 -0
- package/schemas/v1/authority.schema.json +70 -0
- package/schemas/v1/cli-result.schema.json +30 -0
- package/schemas/v1/common.schema.json +274 -0
- package/schemas/v1/demo-capsule.schema.json +78 -0
- package/schemas/v1/evidence-append-result.schema.json +14 -0
- package/schemas/v1/evidence-event.schema.json +181 -0
- package/schemas/v1/evidence-status-result.schema.json +68 -0
- package/schemas/v1/host-profile.schema.json +94 -0
- package/schemas/v1/host-status-result.schema.json +49 -0
- package/schemas/v1/keyring.schema.json +77 -0
- package/schemas/v1/ledger.schema.json +99 -0
- package/schemas/v1/marker.schema.json +84 -0
- package/schemas/v1/matrix-list-result.schema.json +67 -0
- package/schemas/v1/matrix-mutation-result.schema.json +49 -0
- package/schemas/v1/matrix-validation-result.schema.json +77 -0
- package/schemas/v1/mcp-tool-results.schema.json +34 -0
- package/schemas/v1/migration-test-matrix-result.schema.json +76 -0
- package/schemas/v1/presentation-plan-result.schema.json +62 -0
- package/schemas/v1/presentation-plan.schema.json +259 -0
- package/schemas/v1/release-gate-result.schema.json +136 -0
- package/schemas/v1/showcase-approval-result.schema.json +5 -0
- package/schemas/v1/showcase-event-append-result.schema.json +17 -0
- package/schemas/v1/showcase-event.schema.json +235 -0
- package/schemas/v1/showcase-finish-result.schema.json +5 -0
- package/schemas/v1/showcase-run-status-result.schema.json +70 -0
- package/schemas/v1/showcase-start-result.schema.json +5 -0
- package/schemas/v1/use-case-file.schema.json +178 -0
- package/schemas/v1/workflow-mode.schema.json +16 -0
- package/schemas/v1/workspace-config.schema.json +58 -0
- package/use-cases/capsule/demos.yml +212 -0
- package/use-cases/capsule/runner.yml +49 -0
- package/use-cases/diagnostics/contracts.yml +239 -0
- package/use-cases/evidence/core.yml +32 -0
- package/use-cases/evidence/ledger.yml +330 -0
- package/use-cases/hosts/profiles.yml +365 -0
- package/use-cases/hosts/projections.yml +96 -0
- package/use-cases/lifecycle/loop.yml +229 -0
- package/use-cases/matrix/core.yml +92 -0
- package/use-cases/matrix/product.yml +289 -0
- package/use-cases/mcp/surface.yml +257 -0
- package/use-cases/mcp/wrapper.yml +100 -0
- package/use-cases/migration/importer.yml +171 -0
- package/use-cases/migration/test-matrix.yml +32 -0
- package/use-cases/planning/cards.yml +215 -0
- package/use-cases/release/package.yml +80 -0
- package/use-cases/release/proof.yml +180 -0
- package/use-cases/roadmap/deferred.yml +184 -0
- package/use-cases/showcase/flow.yml +269 -0
- package/use-cases/showcase/live.yml +44 -0
- package/use-cases/skills/assets.yml +92 -0
- package/use-cases.yml +9 -0
package/docs/showcase.md
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Showcases
|
|
2
|
+
|
|
3
|
+
A showcase is a live run in front of the user or another reviewer. The agent can
|
|
4
|
+
drive the run, the user can drive it, or a script can drive it, depending on the
|
|
5
|
+
use case and user preference.
|
|
6
|
+
|
|
7
|
+
The mechanical flow is:
|
|
8
|
+
|
|
9
|
+
```text
|
|
10
|
+
start -> item -> observation -> verdict -> continue
|
|
11
|
+
|
|
|
12
|
+
+-> fail -> continue | pause_to_fix | waive_with_reason | abort
|
|
13
|
+
finish -> approval when required
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Use `plan showcase` for a short, high-value demo and `plan walkthrough` for
|
|
17
|
+
broader coverage. Use `capsule plan` when a persisted smoke demo or golden path
|
|
18
|
+
script already exists. A generated plan is prepared material until
|
|
19
|
+
`showcase start --plan-file` records a run against its content hash.
|
|
20
|
+
|
|
21
|
+
Use `capsule run --capsule <id>` when the persisted capsule should be performed
|
|
22
|
+
now. Instruction steps become action events. Static observation steps are
|
|
23
|
+
recorded as prompts for a real runtime observation; they do not become proof and
|
|
24
|
+
do not create pass verdicts by themselves. Command-backed observations can
|
|
25
|
+
record pass/fail verdicts in the same append-only showcase ledger. Successful
|
|
26
|
+
command-backed runs are finished automatically; runs with pending runtime
|
|
27
|
+
observations or failed commands stay open so the agent or user can continue,
|
|
28
|
+
pause to fix, waive with a reason, or abort.
|
|
29
|
+
|
|
30
|
+
Command steps are inert by default. They run only when the caller passes
|
|
31
|
+
`--execute-commands` and the capsule sets `permissions.command_execution: true`.
|
|
32
|
+
The runner executes an exact executable/argv pair without a shell, requires the
|
|
33
|
+
working directory to stay inside the repository, uses a small environment
|
|
34
|
+
allowlist, and records bounded/redacted stdout/stderr plus the exit code as the
|
|
35
|
+
observation.
|
|
36
|
+
|
|
37
|
+
User-required approval cannot be recorded by an agent or MCP tool. The trusted
|
|
38
|
+
path is the interactive CLI-mediated user approval command. Approval is only
|
|
39
|
+
valid after finish, and is bound to the plan hash and finish event.
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
# Tutorial: adopt the matrix in a pure-Python repo (pytest, no JS)
|
|
2
|
+
|
|
3
|
+
This walkthrough proves the headline claim — **anyone can adopt Use Cases,
|
|
4
|
+
not just JavaScript repos** — by taking a tiny Python project from nothing to a
|
|
5
|
+
signed **FRESH** row using a **pure Python toolchain**. There is **no pnpm and no
|
|
6
|
+
vitest** anywhere in the project: the verifier is `pytest`.
|
|
7
|
+
|
|
8
|
+
The complete, runnable project lives at
|
|
9
|
+
[`examples/python-pytest/`](../../examples/python-pytest), and it is exercised
|
|
10
|
+
end-to-end (from the published `uc` tarball, running real `pytest`) by
|
|
11
|
+
[`tests/release/example-python-pytest.test.ts`](../../tests/release/example-python-pytest.test.ts).
|
|
12
|
+
|
|
13
|
+
> The only Node you install is the `uc` CLI itself (the trust engine). The code
|
|
14
|
+
> under test, the acceptance test, and the verifier are 100% Python.
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## What the project looks like
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
examples/python-pytest/
|
|
22
|
+
├─ use-cases.yml # workspace config: acceptance → python.pytest preset
|
|
23
|
+
├─ pytest.ini # importlib mode + pythonpath=src
|
|
24
|
+
├─ src/coupon.py # implementation, wrapped in a marker block
|
|
25
|
+
├─ tests/use_cases/
|
|
26
|
+
│ └─ example.checkout.apply_coupon_test.py # acceptance test the preset runs
|
|
27
|
+
└─ use-cases/checkout.yml # the matrix row
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### The workspace config (`use-cases.yml`)
|
|
31
|
+
|
|
32
|
+
The `acceptance` verifier resolves to the **`python.pytest` preset** — the same
|
|
33
|
+
config-driven verifier model JS repos use, just pointed at pytest:
|
|
34
|
+
|
|
35
|
+
```yaml
|
|
36
|
+
verifiers:
|
|
37
|
+
default: acceptance
|
|
38
|
+
acceptance:
|
|
39
|
+
preset: python.pytest # runs: pytest tests/use_cases/{slug}_test.py
|
|
40
|
+
evidence_kind: test_result
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### The marked code (`src/coupon.py`)
|
|
44
|
+
|
|
45
|
+
`#` is the configured comment prefix for `.py`, so the marker is the Python
|
|
46
|
+
spelling of the same `<comment>: @use-case: <slug>` convention:
|
|
47
|
+
|
|
48
|
+
```python
|
|
49
|
+
#: @use-case: example.checkout.apply_coupon
|
|
50
|
+
COUPONS = {"SAVE10": 10, "HALF": 50}
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def apply_coupon(subtotal_cents: int, code: str) -> int:
|
|
54
|
+
if subtotal_cents <= 0:
|
|
55
|
+
raise ValueError("subtotal must be positive")
|
|
56
|
+
if code not in COUPONS:
|
|
57
|
+
raise KeyError(f"unknown coupon: {code}")
|
|
58
|
+
discount = subtotal_cents * COUPONS[code] // 100
|
|
59
|
+
return subtotal_cents - discount
|
|
60
|
+
#: @use-case: end example.checkout.apply_coupon
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### The acceptance test
|
|
64
|
+
|
|
65
|
+
The `python.pytest` preset derives the path `tests/use_cases/{slug}_test.py` from
|
|
66
|
+
the row id, so the test file is
|
|
67
|
+
`tests/use_cases/example.checkout.apply_coupon_test.py`:
|
|
68
|
+
|
|
69
|
+
```python
|
|
70
|
+
from coupon import apply_coupon
|
|
71
|
+
|
|
72
|
+
def test_percentage_coupon_discounts_the_subtotal():
|
|
73
|
+
assert apply_coupon(1000, "SAVE10") == 900
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
`pytest.ini` makes that path collectable and importable with **no packaging
|
|
77
|
+
boilerplate**:
|
|
78
|
+
|
|
79
|
+
```ini
|
|
80
|
+
[pytest]
|
|
81
|
+
# importlib mode lets pytest collect the dotted row-id filename;
|
|
82
|
+
# pythonpath=src lets the test `from coupon import ...`.
|
|
83
|
+
addopts = --import-mode=importlib
|
|
84
|
+
pythonpath = src
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## The flow: from nothing to FRESH
|
|
90
|
+
|
|
91
|
+
Install the CLI once (the only Node dependency), then drive the trust flow. These
|
|
92
|
+
are the exact commands the release test runs.
|
|
93
|
+
|
|
94
|
+
### 0. Install the CLI and generate a scratch signing key
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
npm i -g use-cases # provides the `uc` binary
|
|
98
|
+
# A throwaway ed25519 keypair. In production the PRIVATE key lives ONLY in CI.
|
|
99
|
+
node -e 'const c=require("crypto"),f=require("fs");const k=c.generateKeyPairSync("ed25519");
|
|
100
|
+
f.writeFileSync("public-key.pem",k.publicKey.export({type:"spki",format:"pem"}));
|
|
101
|
+
f.writeFileSync("private-key.pem",k.privateKey.export({type:"pkcs8",format:"pem"}));'
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### 1. Validate the matrix
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
uc matrix validate --repo . --json # ok: true
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### 2. Register the binding
|
|
111
|
+
|
|
112
|
+
The marker already lives in `src/coupon.py`, so register it without editing
|
|
113
|
+
source:
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
uc bind --repo . \
|
|
117
|
+
--row example.checkout.apply_coupon \
|
|
118
|
+
--file src/coupon.py \
|
|
119
|
+
--mode explicit --register-existing --json
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### 3. Scan — the row is UNPROVEN
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
uc scan --repo . --public-key public-key.pem --json
|
|
126
|
+
# example.checkout.apply_coupon → UNPROVEN (bound, but no signed proof yet)
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### 4. Verify — runs REAL pytest (keyless)
|
|
130
|
+
|
|
131
|
+
`verify` resolves the `python.pytest` preset and actually runs
|
|
132
|
+
`pytest tests/use_cases/example.checkout.apply_coupon_test.py`. It holds **no
|
|
133
|
+
signing key** and writes an unsigned results ledger:
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
uc verify --repo . --all --out verification-results.jsonl \
|
|
137
|
+
--public-key public-key.pem --json
|
|
138
|
+
# results[0].status: "pass", verifier_id: "acceptance", exit_code: 0
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### 5. Prove — sign from the verification result (trusted CI)
|
|
142
|
+
|
|
143
|
+
`prove` consumes the unsigned results, recomputes every hash itself, and mints an
|
|
144
|
+
ed25519-signed proof. Locally you can use the scratch key; in production the key
|
|
145
|
+
is a CI secret:
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
UCM_SIGNING_KEY="$(cat private-key.pem)" \
|
|
149
|
+
uc prove --repo . --all --trusted-ci --append \
|
|
150
|
+
--verification-results verification-results.jsonl \
|
|
151
|
+
--signing-key-env UCM_SIGNING_KEY \
|
|
152
|
+
--public-key public-key.pem --json
|
|
153
|
+
# rows[0].status: "signed", proof_events_appended: 1
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### 6. Scan again — the row is FRESH
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
uc scan --repo . --public-key public-key.pem --json
|
|
160
|
+
# summary: { fresh: 1, ... } example.checkout.apply_coupon → FRESH
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## Why this is honest, not a rubber stamp
|
|
166
|
+
|
|
167
|
+
Break the production code so the genuine acceptance test fails, then re-verify:
|
|
168
|
+
|
|
169
|
+
```bash
|
|
170
|
+
# drop the discount in src/coupon.py, then:
|
|
171
|
+
uc verify --repo . --all --out verification-results.jsonl --public-key public-key.pem --json
|
|
172
|
+
# results[0].status: "fail", exit_code != 0
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
`prove` now refuses (`reason: RESULT_FAILED`, nothing appended) and the row stays
|
|
176
|
+
out of FRESH. The proof is bound to a verifier that **really ran** — exactly the
|
|
177
|
+
guarantee the JS path gives, delivered by a pure-Python toolchain.
|
|
178
|
+
|
|
179
|
+
| Stage | Command | Row state |
|
|
180
|
+
|---|---|---|
|
|
181
|
+
| Authored | `uc matrix validate` | (tracked) |
|
|
182
|
+
| Bound | `uc bind … --register-existing` | UNPROVEN |
|
|
183
|
+
| Verified (keyless, real pytest) | `uc verify --out …` | UNPROVEN (results only) |
|
|
184
|
+
| Proved (trusted, signed) | `uc prove --trusted-ci …` | **FRESH** |
|
|
185
|
+
| Production code broken | `uc verify` → `uc prove` | refused → not FRESH |
|
|
186
|
+
|
|
187
|
+
See [verifiers](../concepts/verifiers.md) for the full preset model and
|
|
188
|
+
[getting started](../getting-started.md) for the JS path and the CI workflow.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
schema_version: 1
|
|
2
|
+
capsule_id: capsule.basic.product_search
|
|
3
|
+
title: Product search showcase
|
|
4
|
+
mode: showcase
|
|
5
|
+
description: Demonstrate the golden product search path.
|
|
6
|
+
audience: reviewer
|
|
7
|
+
timebox_seconds: 600
|
|
8
|
+
items:
|
|
9
|
+
- use_case_id: product.search.golden
|
|
10
|
+
scenario_ids: [product.search.golden.cli]
|
|
11
|
+
runbook:
|
|
12
|
+
- kind: instruction
|
|
13
|
+
text: Open the product search surface.
|
|
14
|
+
- kind: instruction
|
|
15
|
+
text: Search for a known product.
|
|
16
|
+
- kind: observation
|
|
17
|
+
text: Confirm that matching results and a selectable product are visible.
|
|
18
|
+
permissions:
|
|
19
|
+
command_execution: false
|
|
20
|
+
extensions:
|
|
21
|
+
use-cases.dev/runner:
|
|
22
|
+
command: uc capsule run --repo examples/basic-product --capsule capsule.basic.product_search --json
|
|
23
|
+
command_steps: none
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"schema_version":1,"event_type":"evidence_recorded","event_id":"evt_basic_search_evidence_1","aggregate_id":"evidence.basic.search.1","sequence":1,"recorded_at":"2026-06-25T00:00:00.000Z","actor_type":"script","host_surface":"codex.cli","idempotency_key":"example:basic:evidence:search","payload":{"targets":[{"use_case_id":"product.search.golden","use_case_semantic_hash":"sha256:3331f31a3c86b251cf9a2783a06291d7277ab475753c79a709ef1691ac72f701"}],"kind":"test_result","captured_at":"2026-06-25T00:00:00.000Z","result":"pass","summary":"Example product search check passed.","producer":{"type":"script"},"method":{"type":"structured_command","executable":"pnpm","argv":["test","product-search"]},"evidence_kind":"test_result","use_case_ids":["product.search.golden"],"verifier":{"type":"script"},"verdict":"pass"}}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
{"schema_version":1,"event_type":"run_started","event_id":"evt_basic_showcase_start","run_id":"run.basic.product.search","aggregate_id":"run.basic.product.search","sequence":1,"recorded_at":"2026-06-25T00:00:00.000Z","actor_type":"agent","host_surface":"codex.cli","idempotency_key":"example:basic:showcase:start","intent_digest":"sha256:1111111111111111111111111111111111111111111111111111111111111111","payload":{"plan":{"schema_version":1,"plan_id":"plan.basic.product.search","mode":"showcase","complete":true,"selected_items":[{"plan_item_id":"item.product.search.golden","use_case_id":"product.search.golden","scenario_ids":["product.search.golden.cli"],"verification_policy_snapshot":{"mode":"requirements","requirements":[{"evidence_kind":"test_result","required_verifiers":["script"],"minimum_count":1}]},"approval_policy_snapshot":{"mode":"predefined","requirements":[{"approver_type":"user","minimum_count":1}],"statement":"User approval follows the live product search showcase."}}],"known_gaps":[]},"control_mode":"agent_led","initial_epoch_id":"epoch.1","known_gap_acknowledgement":null}}
|
|
2
|
+
{"schema_version":1,"event_type":"observation_recorded","event_id":"evt_basic_showcase_observation","run_id":"run.basic.product.search","aggregate_id":"run.basic.product.search","sequence":2,"recorded_at":"2026-06-25T00:01:00.000Z","actor_type":"agent","host_surface":"codex.cli","idempotency_key":"example:basic:showcase:observation","intent_digest":"sha256:2222222222222222222222222222222222222222222222222222222222222222","payload":{"plan_item_id":"item.product.search.golden","epoch_id":"epoch.1","observation":"The product search result appeared in the live demo."}}
|
|
3
|
+
{"schema_version":1,"event_type":"verdict_recorded","event_id":"evt_basic_showcase_verdict","run_id":"run.basic.product.search","aggregate_id":"run.basic.product.search","sequence":3,"recorded_at":"2026-06-25T00:02:00.000Z","actor_type":"user","host_surface":"codex.cli","idempotency_key":"example:basic:showcase:verdict","intent_digest":"sha256:3333333333333333333333333333333333333333333333333333333333333333","payload":{"plan_item_id":"item.product.search.golden","epoch_id":"epoch.1","observation_event_ids":["evt_basic_showcase_observation"],"verdict":"pass","verifier":{"type":"user"}}}
|
|
4
|
+
{"schema_version":1,"event_type":"run_finished","event_id":"evt_basic_showcase_finish","run_id":"run.basic.product.search","aggregate_id":"run.basic.product.search","sequence":4,"recorded_at":"2026-06-25T00:03:00.000Z","actor_type":"agent","host_surface":"codex.cli","idempotency_key":"example:basic:showcase:finish","intent_digest":"sha256:4444444444444444444444444444444444444444444444444444444444444444","payload":{"requested_finish":true}}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
schema_version: 1
|
|
2
|
+
feature:
|
|
3
|
+
id: product.search
|
|
4
|
+
name: Product search
|
|
5
|
+
summary: Users can find and refine product results.
|
|
6
|
+
metadata:
|
|
7
|
+
owner: use-cases
|
|
8
|
+
lifecycle: active
|
|
9
|
+
use_cases:
|
|
10
|
+
- id: product.search.golden
|
|
11
|
+
title: Find a product from the main search box
|
|
12
|
+
lifecycle: active
|
|
13
|
+
value_tier: critical
|
|
14
|
+
journey_role: golden
|
|
15
|
+
usage_frequency: common
|
|
16
|
+
tags: [product, search, showcase]
|
|
17
|
+
source_refs:
|
|
18
|
+
- kind: file
|
|
19
|
+
path: src/product/search.ts
|
|
20
|
+
actor: shopper
|
|
21
|
+
intent: Find a matching product quickly.
|
|
22
|
+
preconditions:
|
|
23
|
+
- Product catalog contains visible items.
|
|
24
|
+
trigger: Shopper submits a product search.
|
|
25
|
+
scenarios:
|
|
26
|
+
- id: product.search.golden.cli
|
|
27
|
+
kind: steps
|
|
28
|
+
steps:
|
|
29
|
+
- Open the product search surface.
|
|
30
|
+
- Search for a known product.
|
|
31
|
+
- Select the highest-ranked matching result.
|
|
32
|
+
observable_outcomes:
|
|
33
|
+
- Matching product results are visible.
|
|
34
|
+
- The selected product can be opened from the results list.
|
|
35
|
+
host_applicability:
|
|
36
|
+
- host_surface: codex.cli
|
|
37
|
+
supported: true
|
|
38
|
+
- host_surface: claude.cli
|
|
39
|
+
supported: true
|
|
40
|
+
- host_surface: opencode.cli
|
|
41
|
+
supported: true
|
|
42
|
+
verification_policy:
|
|
43
|
+
mode: requirements
|
|
44
|
+
requirements:
|
|
45
|
+
- evidence_kind: test_result
|
|
46
|
+
required_verifiers: [script]
|
|
47
|
+
minimum_count: 1
|
|
48
|
+
approval_policy:
|
|
49
|
+
mode: predefined
|
|
50
|
+
requirements:
|
|
51
|
+
- approver_type: user
|
|
52
|
+
minimum_count: 1
|
|
53
|
+
statement: User approval follows the live product search showcase.
|
|
54
|
+
- id: product.filter.alternate
|
|
55
|
+
title: Refine product results with a filter
|
|
56
|
+
lifecycle: active
|
|
57
|
+
value_tier: core
|
|
58
|
+
journey_role: alternate
|
|
59
|
+
usage_frequency: occasional
|
|
60
|
+
tags: [product, filter]
|
|
61
|
+
source_refs:
|
|
62
|
+
- kind: file
|
|
63
|
+
path: src/product/filter.ts
|
|
64
|
+
actor: shopper
|
|
65
|
+
intent: Narrow a product result set.
|
|
66
|
+
preconditions:
|
|
67
|
+
- Product search results are visible.
|
|
68
|
+
trigger: Shopper applies a category filter.
|
|
69
|
+
scenarios:
|
|
70
|
+
- id: product.filter.alternate.cli
|
|
71
|
+
kind: steps
|
|
72
|
+
steps:
|
|
73
|
+
- Search for a product category.
|
|
74
|
+
- Apply one category filter.
|
|
75
|
+
observable_outcomes:
|
|
76
|
+
- Results are narrowed to the selected category.
|
|
77
|
+
host_applicability:
|
|
78
|
+
- host_surface: codex.cli
|
|
79
|
+
supported: true
|
|
80
|
+
- host_surface: claude.cli
|
|
81
|
+
supported: true
|
|
82
|
+
verification_policy:
|
|
83
|
+
mode: none
|
|
84
|
+
approval_policy:
|
|
85
|
+
mode: none
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"schema_version":1,"event_type":"evidence_recorded","event_id":"evt_bad_json"
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
schema_version: 1
|
|
2
|
+
feature:
|
|
3
|
+
id: damage.duplicate
|
|
4
|
+
name: Duplicate use cases
|
|
5
|
+
summary: Duplicate IDs are ambiguous.
|
|
6
|
+
use_cases:
|
|
7
|
+
- id: damage.duplicate.id
|
|
8
|
+
title: Duplicate use case A
|
|
9
|
+
lifecycle: active
|
|
10
|
+
value_tier: supporting
|
|
11
|
+
journey_role: edge
|
|
12
|
+
usage_frequency: rare
|
|
13
|
+
actor: agent
|
|
14
|
+
intent: Exercise duplicate detection.
|
|
15
|
+
preconditions: [A duplicate sibling exists.]
|
|
16
|
+
trigger: Matrix validation runs.
|
|
17
|
+
scenarios:
|
|
18
|
+
- id: damage.duplicate.a.cli
|
|
19
|
+
kind: steps
|
|
20
|
+
steps: [Validate duplicate A.]
|
|
21
|
+
observable_outcomes: [Duplicate A is marked ambiguous.]
|
|
22
|
+
host_applicability:
|
|
23
|
+
- host_surface: codex.cli
|
|
24
|
+
supported: true
|
|
25
|
+
verification_policy:
|
|
26
|
+
mode: none
|
|
27
|
+
approval_policy:
|
|
28
|
+
mode: none
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
schema_version: 1
|
|
2
|
+
feature:
|
|
3
|
+
id: damage.duplicate
|
|
4
|
+
name: Duplicate use cases
|
|
5
|
+
summary: Duplicate IDs are ambiguous.
|
|
6
|
+
use_cases:
|
|
7
|
+
- id: damage.duplicate.id
|
|
8
|
+
title: Duplicate use case B
|
|
9
|
+
lifecycle: active
|
|
10
|
+
value_tier: supporting
|
|
11
|
+
journey_role: edge
|
|
12
|
+
usage_frequency: rare
|
|
13
|
+
actor: agent
|
|
14
|
+
intent: Exercise duplicate detection.
|
|
15
|
+
preconditions: [A duplicate sibling exists.]
|
|
16
|
+
trigger: Matrix validation runs.
|
|
17
|
+
scenarios:
|
|
18
|
+
- id: damage.duplicate.b.cli
|
|
19
|
+
kind: steps
|
|
20
|
+
steps: [Validate duplicate B.]
|
|
21
|
+
observable_outcomes: [Duplicate B is marked ambiguous.]
|
|
22
|
+
host_applicability:
|
|
23
|
+
- host_surface: codex.cli
|
|
24
|
+
supported: true
|
|
25
|
+
verification_policy:
|
|
26
|
+
mode: none
|
|
27
|
+
approval_policy:
|
|
28
|
+
mode: none
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
schema_version: 1
|
|
2
|
+
feature:
|
|
3
|
+
id: damage.malformed
|
|
4
|
+
name: Malformed file
|
|
5
|
+
summary: This file is intentionally malformed.
|
|
6
|
+
use_cases:
|
|
7
|
+
- id: damage.malformed
|
|
8
|
+
title: Broken
|
|
9
|
+
lifecycle: active
|
|
10
|
+
value_tier: supporting
|
|
11
|
+
journey_role: edge
|
|
12
|
+
usage_frequency: rare
|
|
13
|
+
actor: agent
|
|
14
|
+
intent: [
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
schema_version: 1
|
|
2
|
+
feature:
|
|
3
|
+
id: damage.valid
|
|
4
|
+
name: Damaged fixture valid sibling
|
|
5
|
+
summary: A valid sibling remains usable while nearby files are damaged.
|
|
6
|
+
use_cases:
|
|
7
|
+
- id: damage.valid.sibling
|
|
8
|
+
title: Valid sibling remains addressable
|
|
9
|
+
lifecycle: active
|
|
10
|
+
value_tier: supporting
|
|
11
|
+
journey_role: edge
|
|
12
|
+
usage_frequency: rare
|
|
13
|
+
actor: agent
|
|
14
|
+
intent: Confirm partial matrix recovery.
|
|
15
|
+
preconditions: [At least one nearby file is damaged.]
|
|
16
|
+
trigger: Matrix validation runs.
|
|
17
|
+
scenarios:
|
|
18
|
+
- id: damage.valid.sibling.cli
|
|
19
|
+
kind: steps
|
|
20
|
+
steps: [Validate the damaged workspace.]
|
|
21
|
+
observable_outcomes: [The valid sibling is still addressable.]
|
|
22
|
+
host_applicability:
|
|
23
|
+
- host_surface: codex.cli
|
|
24
|
+
supported: true
|
|
25
|
+
verification_policy:
|
|
26
|
+
mode: none
|
|
27
|
+
approval_policy:
|
|
28
|
+
mode: none
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
schema_version: 1
|
|
2
|
+
workspace_id: host-projections-example
|
|
3
|
+
component_id: host-projections-example
|
|
4
|
+
data_root: .
|
|
5
|
+
use_cases_dir: use-cases
|
|
6
|
+
evidence_dir: evidence
|
|
7
|
+
demo_capsules_dir: demo-capsules
|
|
8
|
+
showcase_runs_dir: showcase-runs
|
|
9
|
+
default_workflow_mode: continuous
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Example: Python + pytest
|
|
2
|
+
|
|
3
|
+
A minimal, already-wired Use Cases workspace that proves the headline
|
|
4
|
+
trust flow against real pytest tests. It mirrors the full walkthrough in
|
|
5
|
+
[`docs/tutorials/python-pytest.md`](../../docs/tutorials/python-pytest.md) — read
|
|
6
|
+
that for the step-by-step narrative; this README is the map.
|
|
7
|
+
|
|
8
|
+
## Layout
|
|
9
|
+
|
|
10
|
+
| Path | What it is |
|
|
11
|
+
|---|---|
|
|
12
|
+
| `use-cases.yml` | Workspace config. `verifiers.default` runs pytest. |
|
|
13
|
+
| `use-cases/checkout.yml` | One behaviour row: `example.checkout.apply_coupon`. |
|
|
14
|
+
| `src/coupon.py` | The code that satisfies the row, wrapped in `//: @use-case:` markers (Python uses `#:` comment prefix). |
|
|
15
|
+
| `tests/use_cases/…_test.py` | The pytest test that verifies the behaviour. |
|
|
16
|
+
|
|
17
|
+
Because the code is already marked, adopt it with `bind --register-existing`
|
|
18
|
+
(register the existing span) rather than a fresh `bind` (which would insert new
|
|
19
|
+
markers).
|
|
20
|
+
|
|
21
|
+
## Run it
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
# from this directory, with `use-cases` installed (npm i -g use-cases)
|
|
25
|
+
uc matrix validate --repo . # matrix is clean
|
|
26
|
+
uc scan --repo . # row is UNBOUND until you register it
|
|
27
|
+
|
|
28
|
+
# register the already-marked span, then run the trust flow:
|
|
29
|
+
uc bind --row example.checkout.apply_coupon \
|
|
30
|
+
--file src/coupon.py --register-existing
|
|
31
|
+
uc verify --all --out verify-results.jsonl --repo . # runs pytest
|
|
32
|
+
# prove needs an ed25519 signing key — see docs/security/key-management.md:
|
|
33
|
+
# node -e '...generateKeyPairSync("ed25519")...' (one-liner in that doc)
|
|
34
|
+
uc prove --all --trusted-ci --signing-key-env UCM_CI_SIGNING_KEY \
|
|
35
|
+
--verification-results verify-results.jsonl --append --repo .
|
|
36
|
+
uc scan --repo . --public-key ci-signing-key.pub.pem # row reads FRESH
|
|
37
|
+
|
|
38
|
+
# now edit src/coupon.py inside the marked span and re-scan — it flips to SUSPECT.
|
|
39
|
+
```
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
[pytest]
|
|
2
|
+
# `--import-mode=importlib` lets pytest collect the acceptance test whose filename
|
|
3
|
+
# carries the dotted row id (example.checkout.apply_coupon_test.py); the default
|
|
4
|
+
# "prepend" import mode rejects dots in module names.
|
|
5
|
+
# `pythonpath = src` puts the implementation module (coupon.py) on sys.path so the
|
|
6
|
+
# test can `from coupon import apply_coupon` without any packaging boilerplate.
|
|
7
|
+
addopts = --import-mode=importlib
|
|
8
|
+
pythonpath = src
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"""A tiny, self-contained checkout helper an adopter might own.
|
|
2
|
+
|
|
3
|
+
The function below is the implementation the use-case row
|
|
4
|
+
`example.checkout.apply_coupon` describes. It is wrapped in a Use Cases
|
|
5
|
+
marker block (the `@use-case` start/end comments below) so the matrix can bind
|
|
6
|
+
the row to exactly these source lines.
|
|
7
|
+
|
|
8
|
+
`#` is the configured comment prefix for `.py`, so the markers are the Python
|
|
9
|
+
spelling of the same convention `//` languages use. No JavaScript, pnpm, or
|
|
10
|
+
vitest is involved anywhere in this project.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
#: @use-case: example.checkout.apply_coupon
|
|
14
|
+
COUPONS = {
|
|
15
|
+
"SAVE10": 10, # 10% off
|
|
16
|
+
"HALF": 50, # 50% off
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def apply_coupon(subtotal_cents: int, code: str) -> int:
|
|
21
|
+
"""Return the cart total in cents after applying coupon ``code``.
|
|
22
|
+
|
|
23
|
+
Raises ``ValueError`` for a non-positive subtotal and ``KeyError`` for an
|
|
24
|
+
unknown coupon code.
|
|
25
|
+
"""
|
|
26
|
+
if subtotal_cents <= 0:
|
|
27
|
+
raise ValueError("subtotal must be positive")
|
|
28
|
+
if code not in COUPONS:
|
|
29
|
+
raise KeyError(f"unknown coupon: {code}")
|
|
30
|
+
discount = subtotal_cents * COUPONS[code] // 100
|
|
31
|
+
return subtotal_cents - discount
|
|
32
|
+
#: @use-case: end example.checkout.apply_coupon
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"""Acceptance test for the `example.checkout.apply_coupon` use-case row.
|
|
2
|
+
|
|
3
|
+
This is a plain pytest module — the `python.pytest` verifier preset runs it with
|
|
4
|
+
|
|
5
|
+
pytest tests/use_cases/example.checkout.apply_coupon_test.py
|
|
6
|
+
|
|
7
|
+
(the path the preset derives from the row id). It imports the implementation via
|
|
8
|
+
the `pythonpath = src` setting in pytest.ini, so there is no JS toolchain here.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
import pytest
|
|
12
|
+
|
|
13
|
+
from coupon import apply_coupon
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def test_percentage_coupon_discounts_the_subtotal():
|
|
17
|
+
assert apply_coupon(1000, "SAVE10") == 900
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def test_half_off_coupon():
|
|
21
|
+
assert apply_coupon(2000, "HALF") == 1000
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def test_unknown_coupon_is_rejected():
|
|
25
|
+
with pytest.raises(KeyError):
|
|
26
|
+
apply_coupon(1000, "NOPE")
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def test_non_positive_subtotal_is_rejected():
|
|
30
|
+
with pytest.raises(ValueError):
|
|
31
|
+
apply_coupon(0, "SAVE10")
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
schema_version: 1
|
|
2
|
+
feature:
|
|
3
|
+
id: example.checkout
|
|
4
|
+
name: Checkout coupons
|
|
5
|
+
summary: Shoppers can apply a coupon code to reduce their cart total.
|
|
6
|
+
metadata:
|
|
7
|
+
owner: example-team
|
|
8
|
+
lifecycle: active
|
|
9
|
+
use_cases:
|
|
10
|
+
- id: example.checkout.apply_coupon
|
|
11
|
+
title: Apply a valid coupon to a cart
|
|
12
|
+
lifecycle: active
|
|
13
|
+
value_tier: critical
|
|
14
|
+
journey_role: golden
|
|
15
|
+
usage_frequency: common
|
|
16
|
+
tags: [checkout, coupon, python]
|
|
17
|
+
source_refs:
|
|
18
|
+
- kind: file
|
|
19
|
+
path: src/coupon.py
|
|
20
|
+
actor: shopper
|
|
21
|
+
intent: Reduce the cart total by applying a known coupon code.
|
|
22
|
+
preconditions:
|
|
23
|
+
- A cart with a positive subtotal exists.
|
|
24
|
+
trigger: The shopper submits a coupon code at checkout.
|
|
25
|
+
scenarios:
|
|
26
|
+
- id: example.checkout.apply_coupon.main
|
|
27
|
+
kind: steps
|
|
28
|
+
steps:
|
|
29
|
+
- The shopper enters a known coupon code.
|
|
30
|
+
- The system looks up the coupon's discount percentage.
|
|
31
|
+
- The system subtracts the discount from the subtotal.
|
|
32
|
+
observable_outcomes:
|
|
33
|
+
- The returned cart total reflects the coupon discount.
|
|
34
|
+
- An unknown coupon code is rejected rather than silently ignored.
|
|
35
|
+
host_applicability:
|
|
36
|
+
- host_surface: codex.cli
|
|
37
|
+
supported: true
|
|
38
|
+
- host_surface: claude.cli
|
|
39
|
+
supported: true
|
|
40
|
+
verification_policy:
|
|
41
|
+
mode: requirements
|
|
42
|
+
requirements:
|
|
43
|
+
- evidence_kind: test_result
|
|
44
|
+
required_verifiers: [acceptance]
|
|
45
|
+
minimum_count: 1
|
|
46
|
+
approval_policy:
|
|
47
|
+
mode: none
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
schema_version: 1
|
|
2
|
+
workspace_id: example.python-pytest
|
|
3
|
+
component_id: example.python-pytest
|
|
4
|
+
data_root: .
|
|
5
|
+
use_cases_dir: use-cases
|
|
6
|
+
evidence_dir: evidence
|
|
7
|
+
demo_capsules_dir: demo-capsules
|
|
8
|
+
showcase_runs_dir: showcase-runs
|
|
9
|
+
default_workflow_mode: continuous
|
|
10
|
+
# Verifiers map a row's required_verifiers id to a real command. `default` is used
|
|
11
|
+
# by any row that does not name its own verifier. This workspace adopts the matrix
|
|
12
|
+
# with a PURE PYTHON toolchain: the `acceptance` verifier resolves to the
|
|
13
|
+
# `python.pytest` preset, which runs `pytest tests/use_cases/<row-id>_test.py`.
|
|
14
|
+
# There is no pnpm/vitest anywhere in this project.
|
|
15
|
+
verifiers:
|
|
16
|
+
default: acceptance
|
|
17
|
+
acceptance:
|
|
18
|
+
preset: python.pytest
|
|
19
|
+
evidence_kind: test_result
|