@ybotok/loam 0.1.0-beta.3 → 0.2.0-alpha.2
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/CHANGELOG.md +2635 -86
- package/COMPARISON.md +80 -63
- package/CONTRIBUTING.md +84 -0
- package/MIGRATING-from-OpenSpec.md +213 -54
- package/QUICKSTART.md +125 -0
- package/README.md +450 -150
- package/ROADMAP.md +599 -0
- package/SCHEMA.md +2355 -256
- package/SECURITY.md +21 -3
- package/WORKFLOW.md +701 -0
- package/dist/cli.js +113 -19
- package/dist/cli.js.map +1 -1
- package/dist/commands/adopt/adopt.js +209 -0
- package/dist/commands/adopt/adopt.js.map +1 -0
- package/dist/commands/adopt/render.js +268 -0
- package/dist/commands/adopt/render.js.map +1 -0
- package/dist/commands/archive/archive.js +77 -0
- package/dist/commands/archive/archive.js.map +1 -0
- package/dist/commands/archive/plan/contracts/asyncapi.js +178 -0
- package/dist/commands/archive/plan/contracts/asyncapi.js.map +1 -0
- package/dist/commands/archive/plan/contracts/openapi.js +159 -0
- package/dist/commands/archive/plan/contracts/openapi.js.map +1 -0
- package/dist/commands/archive/plan/gate.js +323 -0
- package/dist/commands/archive/plan/gate.js.map +1 -0
- package/dist/commands/archive/plan/landscape.js +180 -0
- package/dist/commands/archive/plan/landscape.js.map +1 -0
- package/dist/commands/archive/plan/refusal.js +111 -0
- package/dist/commands/archive/plan/refusal.js.map +1 -0
- package/dist/commands/archive/plan/specs.js +237 -0
- package/dist/commands/archive/plan/specs.js.map +1 -0
- package/dist/commands/archive/plan/state.js +27 -0
- package/dist/commands/archive/plan/state.js.map +1 -0
- package/dist/commands/archive/run.js +252 -0
- package/dist/commands/archive/run.js.map +1 -0
- package/dist/commands/context/context.js +99 -0
- package/dist/commands/context/context.js.map +1 -0
- package/dist/commands/context/print.js +283 -0
- package/dist/commands/context/print.js.map +1 -0
- package/dist/commands/delta/delta.js +279 -0
- package/dist/commands/delta/delta.js.map +1 -0
- package/dist/commands/delta/print.js +205 -0
- package/dist/commands/delta/print.js.map +1 -0
- package/dist/commands/dependencies.js +9 -7
- package/dist/commands/dependencies.js.map +1 -1
- package/dist/commands/diff/diff.js +93 -0
- package/dist/commands/diff/diff.js.map +1 -0
- package/dist/commands/diff/print.js +38 -0
- package/dist/commands/diff/print.js.map +1 -0
- package/dist/commands/doctor.js +5 -4
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/explain/explain.js +151 -0
- package/dist/commands/explain/explain.js.map +1 -0
- package/dist/commands/explore.js +29 -24
- package/dist/commands/explore.js.map +1 -1
- package/dist/commands/gate/gate.js +115 -0
- package/dist/commands/gate/gate.js.map +1 -0
- package/dist/commands/gate/print.js +54 -0
- package/dist/commands/gate/print.js.map +1 -0
- package/dist/commands/gherkin/commit.js +146 -0
- package/dist/commands/gherkin/commit.js.map +1 -0
- package/dist/commands/gherkin/gherkin.js +246 -0
- package/dist/commands/gherkin/gherkin.js.map +1 -0
- package/dist/commands/gherkin/reconcile.js +149 -0
- package/dist/commands/gherkin/reconcile.js.map +1 -0
- package/dist/commands/gherkin/render.js +77 -0
- package/dist/commands/gherkin/render.js.map +1 -0
- package/dist/commands/init/example.js +204 -0
- package/dist/commands/init/example.js.map +1 -0
- package/dist/commands/init/first-hour.js +28 -0
- package/dist/commands/init/first-hour.js.map +1 -0
- package/dist/commands/{init.js → init/init.js} +146 -71
- package/dist/commands/init/init.js.map +1 -0
- package/dist/commands/init/mcp.js +131 -0
- package/dist/commands/init/mcp.js.map +1 -0
- package/dist/commands/init/options.js +78 -0
- package/dist/commands/init/options.js.map +1 -0
- package/dist/commands/instructions.js +72 -14
- package/dist/commands/instructions.js.map +1 -1
- package/dist/commands/list/campaign/campaign.js +65 -0
- package/dist/commands/list/campaign/campaign.js.map +1 -0
- package/dist/commands/list/campaign/owners.js +65 -0
- package/dist/commands/list/campaign/owners.js.map +1 -0
- package/dist/commands/list/json.js +157 -0
- package/dist/commands/list/json.js.map +1 -0
- package/dist/commands/list/list.js +343 -0
- package/dist/commands/list/list.js.map +1 -0
- package/dist/commands/list/print.js +301 -0
- package/dist/commands/list/print.js.map +1 -0
- package/dist/commands/list/review.js +120 -0
- package/dist/commands/list/review.js.map +1 -0
- package/dist/commands/list/views.js +105 -0
- package/dist/commands/list/views.js.map +1 -0
- package/dist/commands/mcp/dispatch.js +183 -0
- package/dist/commands/mcp/dispatch.js.map +1 -0
- package/dist/commands/mcp/mcp.js +34 -0
- package/dist/commands/mcp/mcp.js.map +1 -0
- package/dist/commands/mcp/serve.js +55 -0
- package/dist/commands/mcp/serve.js.map +1 -0
- package/dist/commands/migrate-openspec/materialize/active.js +170 -0
- package/dist/commands/migrate-openspec/materialize/active.js.map +1 -0
- package/dist/commands/migrate-openspec/materialize/feature.js +41 -0
- package/dist/commands/migrate-openspec/materialize/feature.js.map +1 -0
- package/dist/commands/migrate-openspec/materialize/living.js +62 -0
- package/dist/commands/migrate-openspec/materialize/living.js.map +1 -0
- package/dist/commands/migrate-openspec/materialize/stage.js +142 -0
- package/dist/commands/migrate-openspec/materialize/stage.js.map +1 -0
- package/dist/commands/migrate-openspec/materialize/target.js +219 -0
- package/dist/commands/migrate-openspec/materialize/target.js.map +1 -0
- package/dist/commands/migrate-openspec/migrate-openspec.js +142 -0
- package/dist/commands/migrate-openspec/migrate-openspec.js.map +1 -0
- package/dist/commands/migrate-openspec/openspec/decisions.js +91 -0
- package/dist/commands/migrate-openspec/openspec/decisions.js.map +1 -0
- package/dist/commands/migrate-openspec/openspec/error.js +19 -0
- package/dist/commands/migrate-openspec/openspec/error.js.map +1 -0
- package/dist/commands/migrate-openspec/openspec/mapping.js +170 -0
- package/dist/commands/migrate-openspec/openspec/mapping.js.map +1 -0
- package/dist/commands/migrate-openspec/openspec/paths.js +43 -0
- package/dist/commands/migrate-openspec/openspec/paths.js.map +1 -0
- package/dist/commands/migrate-openspec/openspec/read.js +49 -0
- package/dist/commands/migrate-openspec/openspec/read.js.map +1 -0
- package/dist/commands/migrate-openspec/print.js +89 -0
- package/dist/commands/migrate-openspec/print.js.map +1 -0
- package/dist/commands/new/commit.js +76 -0
- package/dist/commands/new/commit.js.map +1 -0
- package/dist/commands/new/new.js +283 -0
- package/dist/commands/new/new.js.map +1 -0
- package/dist/commands/new/templates.js +355 -0
- package/dist/commands/new/templates.js.map +1 -0
- package/dist/commands/open.js +203 -0
- package/dist/commands/open.js.map +1 -0
- package/dist/commands/policy/format.js +152 -0
- package/dist/commands/policy/format.js.map +1 -0
- package/dist/commands/{docs-repo-gate.js → policy/gate.js} +11 -11
- package/dist/commands/policy/gate.js.map +1 -0
- package/dist/commands/rebase/edit.js +106 -0
- package/dist/commands/rebase/edit.js.map +1 -0
- package/dist/commands/rebase/living.js +185 -0
- package/dist/commands/rebase/living.js.map +1 -0
- package/dist/commands/rebase/plan.js +245 -0
- package/dist/commands/rebase/plan.js.map +1 -0
- package/dist/commands/rebase/rebase.js +275 -0
- package/dist/commands/rebase/rebase.js.map +1 -0
- package/dist/commands/seed/commit.js +192 -0
- package/dist/commands/seed/commit.js.map +1 -0
- package/dist/commands/seed/plan.js +133 -0
- package/dist/commands/seed/plan.js.map +1 -0
- package/dist/commands/seed/seed.js +172 -0
- package/dist/commands/seed/seed.js.map +1 -0
- package/dist/commands/show/feature.js +178 -0
- package/dist/commands/show/feature.js.map +1 -0
- package/dist/commands/show/marks.js +24 -0
- package/dist/commands/show/marks.js.map +1 -0
- package/dist/commands/{show.js → show/service.js} +63 -152
- package/dist/commands/show/service.js.map +1 -0
- package/dist/commands/show/show.js +77 -0
- package/dist/commands/show/show.js.map +1 -0
- package/dist/commands/status/json.js +45 -0
- package/dist/commands/status/json.js.map +1 -0
- package/dist/commands/status/print.js +157 -0
- package/dist/commands/status/print.js.map +1 -0
- package/dist/commands/status/status.js +119 -0
- package/dist/commands/status/status.js.map +1 -0
- package/dist/commands/steps/steps.js +189 -0
- package/dist/commands/steps/steps.js.map +1 -0
- package/dist/commands/subsystem/edit.js +192 -0
- package/dist/commands/subsystem/edit.js.map +1 -0
- package/dist/commands/subsystem/move.js +265 -0
- package/dist/commands/subsystem/move.js.map +1 -0
- package/dist/commands/subsystem/query.js +115 -0
- package/dist/commands/subsystem/query.js.map +1 -0
- package/dist/commands/subsystem/subsystem.js +101 -0
- package/dist/commands/subsystem/subsystem.js.map +1 -0
- package/dist/commands/subsystem/sync.js +103 -0
- package/dist/commands/subsystem/sync.js.map +1 -0
- package/dist/commands/subsystem/txn/txn.js +94 -0
- package/dist/commands/subsystem/txn/txn.js.map +1 -0
- package/dist/commands/subsystem/txn/views.js +70 -0
- package/dist/commands/subsystem/txn/views.js.map +1 -0
- package/dist/commands/unarchive/manifest.js +160 -0
- package/dist/commands/unarchive/manifest.js.map +1 -0
- package/dist/commands/{unarchive.js → unarchive/restore.js} +47 -160
- package/dist/commands/unarchive/restore.js.map +1 -0
- package/dist/commands/unarchive/unarchive.js +67 -0
- package/dist/commands/unarchive/unarchive.js.map +1 -0
- package/dist/commands/validate/arch-coverage.js +204 -0
- package/dist/commands/validate/arch-coverage.js.map +1 -0
- package/dist/commands/validate/checks/fleet-shape.js +296 -0
- package/dist/commands/validate/checks/fleet-shape.js.map +1 -0
- package/dist/commands/validate/checks/health-deps.js +55 -0
- package/dist/commands/validate/checks/health-deps.js.map +1 -0
- package/dist/commands/validate/checks/requirements.js +254 -0
- package/dist/commands/validate/checks/requirements.js.map +1 -0
- package/dist/commands/validate/checks/sources.js +76 -0
- package/dist/commands/validate/checks/sources.js.map +1 -0
- package/dist/commands/validate/checks/vocabulary.js +31 -0
- package/dist/commands/validate/checks/vocabulary.js.map +1 -0
- package/dist/commands/validate/feature.js +216 -0
- package/dist/commands/validate/feature.js.map +1 -0
- package/dist/commands/validate/fleet/census.js +69 -0
- package/dist/commands/validate/fleet/census.js.map +1 -0
- package/dist/commands/validate/fleet/kind-tags.js +39 -0
- package/dist/commands/validate/fleet/kind-tags.js.map +1 -0
- package/dist/commands/validate/fleet/landscape.js +353 -0
- package/dist/commands/validate/fleet/landscape.js.map +1 -0
- package/dist/commands/validate/fleet/load.js +52 -0
- package/dist/commands/validate/fleet/load.js.map +1 -0
- package/dist/commands/validate/fleet/obligations.js +270 -0
- package/dist/commands/validate/fleet/obligations.js.map +1 -0
- package/dist/commands/validate/fleet/scorecard/adoption.js +102 -0
- package/dist/commands/validate/fleet/scorecard/adoption.js.map +1 -0
- package/dist/commands/validate/fleet/scorecard/contracts.js +98 -0
- package/dist/commands/validate/fleet/scorecard/contracts.js.map +1 -0
- package/dist/commands/validate/fleet/scorecard/print.js +63 -0
- package/dist/commands/validate/fleet/scorecard/print.js.map +1 -0
- package/dist/commands/validate/fleet/scorecard/scorecard.js +156 -0
- package/dist/commands/validate/fleet/scorecard/scorecard.js.map +1 -0
- package/dist/commands/validate/fleet/usecases/capability-tag.js +94 -0
- package/dist/commands/validate/fleet/usecases/capability-tag.js.map +1 -0
- package/dist/commands/validate/fleet/usecases/place.js +13 -0
- package/dist/commands/validate/fleet/usecases/place.js.map +1 -0
- package/dist/commands/validate/fleet/usecases/requirement-tag.js +95 -0
- package/dist/commands/validate/fleet/usecases/requirement-tag.js.map +1 -0
- package/dist/commands/validate/fleet/usecases/steps.js +197 -0
- package/dist/commands/validate/fleet/usecases/steps.js.map +1 -0
- package/dist/commands/validate/fleet/usecases/usecases.js +99 -0
- package/dist/commands/validate/fleet/usecases/usecases.js.map +1 -0
- package/dist/commands/validate/fleet/views/ids.js +40 -0
- package/dist/commands/validate/fleet/views/ids.js.map +1 -0
- package/dist/commands/validate/fleet/views/stale.js +59 -0
- package/dist/commands/validate/fleet/views/stale.js.map +1 -0
- package/dist/commands/validate/links/corpus.js +92 -0
- package/dist/commands/validate/links/corpus.js.map +1 -0
- package/dist/commands/validate/links/glossary.js +75 -0
- package/dist/commands/validate/links/glossary.js.map +1 -0
- package/dist/commands/validate/report.js +269 -0
- package/dist/commands/validate/report.js.map +1 -0
- package/dist/commands/validate/service/api.js +338 -0
- package/dist/commands/validate/service/api.js.map +1 -0
- package/dist/commands/validate/service/events/events.js +219 -0
- package/dist/commands/validate/service/events/events.js.map +1 -0
- package/dist/commands/validate/service/events/message-producers.js +77 -0
- package/dist/commands/validate/service/events/message-producers.js.map +1 -0
- package/dist/commands/validate/service/evidence-pins.js +131 -0
- package/dist/commands/validate/service/evidence-pins.js.map +1 -0
- package/dist/commands/validate/service/service.js +251 -0
- package/dist/commands/validate/service/service.js.map +1 -0
- package/dist/commands/validate/service/specs.js +251 -0
- package/dist/commands/validate/service/specs.js.map +1 -0
- package/dist/commands/validate/service/spine.js +113 -0
- package/dist/commands/validate/service/spine.js.map +1 -0
- package/dist/commands/validate/validate.js +338 -0
- package/dist/commands/validate/validate.js.map +1 -0
- package/dist/commands/verify/cross/diff.js +182 -0
- package/dist/commands/verify/cross/diff.js.map +1 -0
- package/dist/commands/verify/evidence/contract.js +32 -0
- package/dist/commands/verify/evidence/contract.js.map +1 -0
- package/dist/commands/verify/evidence/pins.js +52 -0
- package/dist/commands/verify/evidence/pins.js.map +1 -0
- package/dist/commands/verify/evidence/read.js +72 -0
- package/dist/commands/verify/evidence/read.js.map +1 -0
- package/dist/commands/verify/frozen.js +241 -0
- package/dist/commands/verify/frozen.js.map +1 -0
- package/dist/commands/verify/record.js +226 -0
- package/dist/commands/verify/record.js.map +1 -0
- package/dist/commands/verify/report.js +223 -0
- package/dist/commands/verify/report.js.map +1 -0
- package/dist/commands/verify/results.js +246 -0
- package/dist/commands/verify/results.js.map +1 -0
- package/dist/commands/verify/verify.js +217 -0
- package/dist/commands/verify/verify.js.map +1 -0
- package/dist/commands/vouch/contract.js +11 -0
- package/dist/commands/vouch/contract.js.map +1 -0
- package/dist/commands/vouch/pack/contract.js +2 -0
- package/dist/commands/vouch/pack/contract.js.map +1 -0
- package/dist/commands/vouch/pack/pack.js +266 -0
- package/dist/commands/vouch/pack/pack.js.map +1 -0
- package/dist/commands/vouch/pack/print.js +271 -0
- package/dist/commands/vouch/pack/print.js.map +1 -0
- package/dist/commands/vouch/pack/sections.js +142 -0
- package/dist/commands/vouch/pack/sections.js.map +1 -0
- package/dist/commands/vouch/prompt/confirm.js +46 -0
- package/dist/commands/vouch/prompt/confirm.js.map +1 -0
- package/dist/commands/vouch/report.js +101 -0
- package/dist/commands/vouch/report.js.map +1 -0
- package/dist/commands/vouch/run.js +285 -0
- package/dist/commands/vouch/run.js.map +1 -0
- package/dist/commands/vouch/sample/plan.js +125 -0
- package/dist/commands/vouch/sample/plan.js.map +1 -0
- package/dist/commands/vouch/sample/print.js +109 -0
- package/dist/commands/vouch/sample/print.js.map +1 -0
- package/dist/commands/vouch/vet/verify.js +123 -0
- package/dist/commands/vouch/vet/verify.js.map +1 -0
- package/dist/commands/vouch/vouch.js +176 -0
- package/dist/commands/vouch/vouch.js.map +1 -0
- package/dist/core/agent/agents-md/artifacts.js +220 -0
- package/dist/core/agent/agents-md/artifacts.js.map +1 -0
- package/dist/core/agent/agents-md/command-map.js +324 -0
- package/dist/core/agent/agents-md/command-map.js.map +1 -0
- package/dist/core/agent/agents-md/cycle.js +165 -0
- package/dist/core/agent/agents-md/cycle.js.map +1 -0
- package/dist/core/agent/agents-md/map/explain.js +34 -0
- package/dist/core/agent/agents-md/map/explain.js.map +1 -0
- package/dist/core/agent/agents-md/map/lenses/context.js +41 -0
- package/dist/core/agent/agents-md/map/lenses/context.js.map +1 -0
- package/dist/core/agent/agents-md/map/lenses/diff.js +46 -0
- package/dist/core/agent/agents-md/map/lenses/diff.js.map +1 -0
- package/dist/core/agent/agents-md/map/lenses/gate.js +57 -0
- package/dist/core/agent/agents-md/map/lenses/gate.js.map +1 -0
- package/dist/core/agent/agents-md/map/mcp.js +41 -0
- package/dist/core/agent/agents-md/map/mcp.js.map +1 -0
- package/dist/core/agent/agents-md/map/status.js +62 -0
- package/dist/core/agent/agents-md/map/status.js.map +1 -0
- package/dist/core/agent/agents-md/map/subsystem.js +32 -0
- package/dist/core/agent/agents-md/map/subsystem.js.map +1 -0
- package/dist/core/agent/agents-md/map/usecases.js +60 -0
- package/dist/core/agent/agents-md/map/usecases.js.map +1 -0
- package/dist/core/agent/agents-md/refusals.js +246 -0
- package/dist/core/agent/agents-md/refusals.js.map +1 -0
- package/dist/core/agent/agents-md/shipped/archive-gate.js +98 -0
- package/dist/core/agent/agents-md/shipped/archive-gate.js.map +1 -0
- package/dist/core/agent/agents-md/spine.js +40 -0
- package/dist/core/agent/agents-md/spine.js.map +1 -0
- package/dist/core/agent/agents-md.js +170 -0
- package/dist/core/agent/agents-md.js.map +1 -0
- package/dist/core/{agents-stamp.js → agent/agents-stamp.js} +50 -0
- package/dist/core/agent/agents-stamp.js.map +1 -0
- package/dist/core/agent/contract.js +2 -0
- package/dist/core/agent/contract.js.map +1 -0
- package/dist/core/agent/protocol.js +193 -0
- package/dist/core/agent/protocol.js.map +1 -0
- package/dist/core/agent/scaffold.js +259 -0
- package/dist/core/agent/scaffold.js.map +1 -0
- package/dist/core/agent/support/report.js +103 -0
- package/dist/core/agent/support/report.js.map +1 -0
- package/dist/core/agent/tools/dialects.js +150 -0
- package/dist/core/agent/tools/dialects.js.map +1 -0
- package/dist/core/agent/tools/registry.js +228 -0
- package/dist/core/agent/tools/registry.js.map +1 -0
- package/dist/core/agent/workflows/adopt.js +133 -0
- package/dist/core/agent/workflows/adopt.js.map +1 -0
- package/dist/core/agent/workflows/check.js +337 -0
- package/dist/core/agent/workflows/check.js.map +1 -0
- package/dist/core/agent/workflows/closing.js +262 -0
- package/dist/core/agent/workflows/closing.js.map +1 -0
- package/dist/core/agent/workflows/feature.js +105 -0
- package/dist/core/agent/workflows/feature.js.map +1 -0
- package/dist/core/agent/workflows/implement.js +105 -0
- package/dist/core/agent/workflows/implement.js.map +1 -0
- package/dist/core/agent/workflows/reference/authoring.js +209 -0
- package/dist/core/agent/workflows/reference/authoring.js.map +1 -0
- package/dist/core/agent/workflows/reference/codes.js +65 -0
- package/dist/core/agent/workflows/reference/codes.js.map +1 -0
- package/dist/core/agent/workflows/reference/done-check.js +188 -0
- package/dist/core/agent/workflows/reference/done-check.js.map +1 -0
- package/dist/core/agent/workflows/reference/reference.js +16 -0
- package/dist/core/agent/workflows/reference/reference.js.map +1 -0
- package/dist/core/agent/workflows/reference/spine.js +297 -0
- package/dist/core/agent/workflows/reference/spine.js.map +1 -0
- package/dist/core/asyncapi/baseline/plan.js +110 -0
- package/dist/core/asyncapi/baseline/plan.js.map +1 -0
- package/dist/core/asyncapi/baseline/surfaces.js +54 -0
- package/dist/core/asyncapi/baseline/surfaces.js.map +1 -0
- package/dist/core/asyncapi/depth.js +164 -0
- package/dist/core/asyncapi/depth.js.map +1 -0
- package/dist/core/asyncapi/digest.js +141 -0
- package/dist/core/asyncapi/digest.js.map +1 -0
- package/dist/core/asyncapi/merge/components.js +91 -0
- package/dist/core/asyncapi/merge/components.js.map +1 -0
- package/dist/core/asyncapi/merge/error.js +33 -0
- package/dist/core/asyncapi/merge/error.js.map +1 -0
- package/dist/core/asyncapi/merge/markers.js +308 -0
- package/dist/core/asyncapi/merge/markers.js.map +1 -0
- package/dist/core/asyncapi/merge/merge.js +215 -0
- package/dist/core/asyncapi/merge/merge.js.map +1 -0
- package/dist/core/asyncapi/merge/pin.js +107 -0
- package/dist/core/asyncapi/merge/pin.js.map +1 -0
- package/dist/core/asyncapi/model.js +11 -0
- package/dist/core/asyncapi/model.js.map +1 -0
- package/dist/core/asyncapi/producers.js +50 -0
- package/dist/core/asyncapi/producers.js.map +1 -0
- package/dist/core/{asyncapi.js → asyncapi/read.js} +95 -109
- package/dist/core/asyncapi/read.js.map +1 -0
- package/dist/core/brief/brief.js +225 -0
- package/dist/core/brief/brief.js.map +1 -0
- package/dist/core/brief/checks.js +250 -0
- package/dist/core/brief/checks.js.map +1 -0
- package/dist/core/brief/landscape.js +194 -0
- package/dist/core/brief/landscape.js.map +1 -0
- package/dist/core/brief/targets.js +226 -0
- package/dist/core/brief/targets.js.map +1 -0
- package/dist/core/brief/unchecked.js +48 -0
- package/dist/core/brief/unchecked.js.map +1 -0
- package/dist/core/c4/arch.js +174 -0
- package/dist/core/c4/arch.js.map +1 -0
- package/dist/core/c4/likec4.js +90 -0
- package/dist/core/c4/likec4.js.map +1 -0
- package/dist/core/c4/parsed/deployment.js +158 -0
- package/dist/core/c4/parsed/deployment.js.map +1 -0
- package/dist/core/c4/parsed/dynamic-views.js +132 -0
- package/dist/core/c4/parsed/dynamic-views.js.map +1 -0
- package/dist/core/c4/parsed/specification.js +78 -0
- package/dist/core/c4/parsed/specification.js.map +1 -0
- package/dist/core/c4/parsed/values.js +57 -0
- package/dist/core/c4/parsed/values.js.map +1 -0
- package/dist/core/c4/parsed/view-ids.js +75 -0
- package/dist/core/c4/parsed/view-ids.js.map +1 -0
- package/dist/core/c4/project/architecture.js +45 -0
- package/dist/core/c4/project/architecture.js.map +1 -0
- package/dist/core/c4/project/documents.js +58 -0
- package/dist/core/c4/project/documents.js.map +1 -0
- package/dist/core/c4/project/load.js +187 -0
- package/dist/core/c4/project/load.js.map +1 -0
- package/dist/core/c4/project/staged.js +220 -0
- package/dist/core/c4/project/staged.js.map +1 -0
- package/dist/core/c4/resolve/service.js +159 -0
- package/dist/core/c4/resolve/service.js.map +1 -0
- package/dist/core/c4/resolve/steps.js +144 -0
- package/dist/core/c4/resolve/steps.js.map +1 -0
- package/dist/core/c4/seed/fleet-file.js +201 -0
- package/dist/core/c4/seed/fleet-file.js.map +1 -0
- package/dist/core/c4/seed/items.js +91 -0
- package/dist/core/c4/seed/items.js.map +1 -0
- package/dist/core/c4/seed/stamp.js +48 -0
- package/dist/core/c4/seed/stamp.js.map +1 -0
- package/dist/core/c4/seed/template.js +109 -0
- package/dist/core/c4/seed/template.js.map +1 -0
- package/dist/core/c4/source-mask.js +82 -0
- package/dist/core/c4/source-mask.js.map +1 -0
- package/dist/core/c4/source-scan.js +227 -0
- package/dist/core/c4/source-scan.js.map +1 -0
- package/dist/core/c4/splice/authored-source.js +101 -0
- package/dist/core/c4/splice/authored-source.js.map +1 -0
- package/dist/core/c4/splice/contract.js +10 -0
- package/dist/core/c4/splice/contract.js.map +1 -0
- package/dist/core/c4/splice/delta-blocks.js +139 -0
- package/dist/core/c4/splice/delta-blocks.js.map +1 -0
- package/dist/core/c4/splice/identity/edges.js +36 -0
- package/dist/core/c4/splice/identity/edges.js.map +1 -0
- package/dist/core/c4/splice/landscape-merge.js +269 -0
- package/dist/core/c4/splice/landscape-merge.js.map +1 -0
- package/dist/core/c4/splice/placement.js +194 -0
- package/dist/core/c4/splice/placement.js.map +1 -0
- package/dist/core/c4/workspace.js +174 -0
- package/dist/core/c4/workspace.js.map +1 -0
- package/dist/core/capabilities/authoring/notes.js +141 -0
- package/dist/core/capabilities/authoring/notes.js.map +1 -0
- package/dist/core/capabilities/capabilities.js +124 -0
- package/dist/core/capabilities/capabilities.js.map +1 -0
- package/dist/core/capabilities/delta/doc.js +50 -0
- package/dist/core/capabilities/delta/doc.js.map +1 -0
- package/dist/core/capabilities/delta/overlay.js +129 -0
- package/dist/core/capabilities/delta/overlay.js.map +1 -0
- package/dist/core/capabilities/delta/summary.js +57 -0
- package/dist/core/capabilities/delta/summary.js.map +1 -0
- package/dist/core/capabilities/delta/tree.js +43 -0
- package/dist/core/capabilities/delta/tree.js.map +1 -0
- package/dist/core/capabilities/delta/uncovered.js +222 -0
- package/dist/core/capabilities/delta/uncovered.js.map +1 -0
- package/dist/core/capabilities/findings.js +342 -0
- package/dist/core/capabilities/findings.js.map +1 -0
- package/dist/core/capabilities/realizes/findings.js +181 -0
- package/dist/core/capabilities/realizes/findings.js.map +1 -0
- package/dist/core/capabilities/realizes/join.js +143 -0
- package/dist/core/capabilities/realizes/join.js.map +1 -0
- package/dist/core/capabilities/rollup.js +199 -0
- package/dist/core/capabilities/rollup.js.map +1 -0
- package/dist/core/capabilities/tree.js +126 -0
- package/dist/core/capabilities/tree.js.map +1 -0
- package/dist/core/capabilities/usecase-join.js +277 -0
- package/dist/core/capabilities/usecase-join.js.map +1 -0
- package/dist/core/coherence/authoring/scaffold.js +177 -0
- package/dist/core/coherence/authoring/scaffold.js.map +1 -0
- package/dist/core/coherence/authoring/sentinels.js +74 -0
- package/dist/core/coherence/authoring/sentinels.js.map +1 -0
- package/dist/core/coherence/coherence.js +287 -0
- package/dist/core/coherence/coherence.js.map +1 -0
- package/dist/core/coherence/declared.js +269 -0
- package/dist/core/coherence/declared.js.map +1 -0
- package/dist/core/coherence/events/declared.js +206 -0
- package/dist/core/coherence/events/declared.js.map +1 -0
- package/dist/core/coherence/events/events.js +204 -0
- package/dist/core/coherence/events/events.js.map +1 -0
- package/dist/core/coherence/events/grades.js +166 -0
- package/dist/core/coherence/events/grades.js.map +1 -0
- package/dist/core/coherence/events/lookups.js +122 -0
- package/dist/core/coherence/events/lookups.js.map +1 -0
- package/dist/core/coherence/events/merged.js +40 -0
- package/dist/core/coherence/events/merged.js.map +1 -0
- package/dist/core/coherence/living.js +198 -0
- package/dist/core/coherence/living.js.map +1 -0
- package/dist/core/coherence/lookups.js +155 -0
- package/dist/core/coherence/lookups.js.map +1 -0
- package/dist/core/coherence/pending.js +39 -0
- package/dist/core/coherence/pending.js.map +1 -0
- package/dist/core/conflict-markers.js +60 -0
- package/dist/core/conflict-markers.js.map +1 -0
- package/dist/core/delta/claims.js +73 -0
- package/dist/core/delta/claims.js.map +1 -0
- package/dist/core/delta/delta.js +296 -0
- package/dist/core/delta/delta.js.map +1 -0
- package/dist/core/delta/document.js +177 -0
- package/dist/core/delta/document.js.map +1 -0
- package/dist/core/delta/scope.js +48 -0
- package/dist/core/delta/scope.js.map +1 -0
- package/dist/core/delta/select.js +237 -0
- package/dist/core/delta/select.js.map +1 -0
- package/dist/core/dependencies/dependencies.js +141 -0
- package/dist/core/dependencies/dependencies.js.map +1 -0
- package/dist/core/dependencies/facts.js +165 -0
- package/dist/core/dependencies/facts.js.map +1 -0
- package/dist/core/dependencies/fanin.js +88 -0
- package/dist/core/dependencies/fanin.js.map +1 -0
- package/dist/core/dependencies/graph.js +106 -0
- package/dist/core/dependencies/graph.js.map +1 -0
- package/dist/core/deployment/delta.js +188 -0
- package/dist/core/deployment/delta.js.map +1 -0
- package/dist/core/deployment/objects.js +145 -0
- package/dist/core/deployment/objects.js.map +1 -0
- package/dist/core/diff/base-git.js +148 -0
- package/dist/core/diff/base-git.js.map +1 -0
- package/dist/core/diff/base-state.js +209 -0
- package/dist/core/diff/base-state.js.map +1 -0
- package/dist/core/diff/current-state.js +96 -0
- package/dist/core/diff/current-state.js.map +1 -0
- package/dist/core/diff/scope/changed-paths.js +188 -0
- package/dist/core/diff/scope/changed-paths.js.map +1 -0
- package/dist/core/diff/semantic.js +243 -0
- package/dist/core/diff/semantic.js.map +1 -0
- package/dist/core/diff/victims.js +247 -0
- package/dist/core/diff/victims.js.map +1 -0
- package/dist/core/docs.js +7 -64
- package/dist/core/docs.js.map +1 -1
- package/dist/core/doctor/agents.js +222 -0
- package/dist/core/doctor/agents.js.map +1 -0
- package/dist/core/doctor/config.js +135 -0
- package/dist/core/doctor/config.js.map +1 -0
- package/dist/core/doctor/doctor.js +275 -0
- package/dist/core/doctor/doctor.js.map +1 -0
- package/dist/core/doctor/report.js +13 -0
- package/dist/core/doctor/report.js.map +1 -0
- package/dist/core/doctor/residue.js +110 -0
- package/dist/core/doctor/residue.js.map +1 -0
- package/dist/core/document/apply.js +77 -0
- package/dist/core/document/apply.js.map +1 -0
- package/dist/core/{frontmatter.js → document/frontmatter.js} +48 -2
- package/dist/core/document/frontmatter.js.map +1 -0
- package/dist/core/document/grammar/directives.js +143 -0
- package/dist/core/document/grammar/directives.js.map +1 -0
- package/dist/core/document/parse.js +263 -0
- package/dist/core/document/parse.js.map +1 -0
- package/dist/core/document/scenarios.js +221 -0
- package/dist/core/document/scenarios.js.map +1 -0
- package/dist/core/document/spec.js +241 -0
- package/dist/core/document/spec.js.map +1 -0
- package/dist/core/{config.js → envelope/config.js} +79 -18
- package/dist/core/envelope/config.js.map +1 -0
- package/dist/core/envelope/json.js +175 -0
- package/dist/core/envelope/json.js.map +1 -0
- package/dist/core/{version.js → envelope/version.js} +3 -3
- package/dist/core/envelope/version.js.map +1 -0
- package/dist/core/explain/families.js +175 -0
- package/dist/core/explain/families.js.map +1 -0
- package/dist/core/explain/fix-tables.js +178 -0
- package/dist/core/explain/fix-tables.js.map +1 -0
- package/dist/core/explain/lookup.js +181 -0
- package/dist/core/explain/lookup.js.map +1 -0
- package/dist/core/explain/refusals.js +49 -0
- package/dist/core/explain/refusals.js.map +1 -0
- package/dist/core/explain/terms.js +144 -0
- package/dist/core/explain/terms.js.map +1 -0
- package/dist/core/explore/describe.js +105 -0
- package/dist/core/explore/describe.js.map +1 -0
- package/dist/core/{explore.js → explore/explore.js} +50 -101
- package/dist/core/explore/explore.js.map +1 -0
- package/dist/core/fleet-context.js +120 -78
- package/dist/core/fleet-context.js.map +1 -1
- package/dist/core/gate/checks.js +201 -0
- package/dist/core/gate/checks.js.map +1 -0
- package/dist/core/gate/partners.js +205 -0
- package/dist/core/gate/partners.js.map +1 -0
- package/dist/core/gate/report.js +47 -0
- package/dist/core/gate/report.js.map +1 -0
- package/dist/core/gate/verification.js +113 -0
- package/dist/core/gate/verification.js.map +1 -0
- package/dist/core/gherkin/digest.js +60 -0
- package/dist/core/gherkin/digest.js.map +1 -0
- package/dist/core/gherkin/emit.js +177 -0
- package/dist/core/gherkin/emit.js.map +1 -0
- package/dist/core/gherkin/read.js +76 -0
- package/dist/core/gherkin/read.js.map +1 -0
- package/dist/core/gherkin/stale.js +234 -0
- package/dist/core/gherkin/stale.js.map +1 -0
- package/dist/core/gherkin/stamp.js +77 -0
- package/dist/core/gherkin/stamp.js.map +1 -0
- package/dist/core/gherkin/steps/catalogue.js +154 -0
- package/dist/core/gherkin/steps/catalogue.js.map +1 -0
- package/dist/core/gherkin/steps/inventory.js +98 -0
- package/dist/core/gherkin/steps/inventory.js.map +1 -0
- package/dist/core/gherkin/steps/phrase.js +72 -0
- package/dist/core/gherkin/steps/phrase.js.map +1 -0
- package/dist/core/glossary/delta.js +106 -0
- package/dist/core/glossary/delta.js.map +1 -0
- package/dist/core/glossary/tree.js +86 -0
- package/dist/core/glossary/tree.js.map +1 -0
- package/dist/core/kernel/concurrency.js.map +1 -0
- package/dist/core/{document-bytes.js → kernel/document-bytes.js} +1 -1
- package/dist/core/kernel/document-bytes.js.map +1 -0
- package/dist/core/kernel/fences.js +42 -0
- package/dist/core/kernel/fences.js.map +1 -0
- package/dist/core/kernel/ids/capability.js +72 -0
- package/dist/core/kernel/ids/capability.js.map +1 -0
- package/dist/core/kernel/ids/dirs.js +33 -0
- package/dist/core/kernel/ids/dirs.js.map +1 -0
- package/dist/core/kernel/ids/feature.js +75 -0
- package/dist/core/kernel/ids/feature.js.map +1 -0
- package/dist/core/kernel/ids/service.js +156 -0
- package/dist/core/kernel/ids/service.js.map +1 -0
- package/dist/core/kernel/ids/subsystem.js +63 -0
- package/dist/core/kernel/ids/subsystem.js.map +1 -0
- package/dist/core/{path-safety.js → kernel/path-safety.js} +18 -4
- package/dist/core/kernel/path-safety.js.map +1 -0
- package/dist/core/kernel/records.js.map +1 -0
- package/dist/core/links/backlinks.js +68 -0
- package/dist/core/links/backlinks.js.map +1 -0
- package/dist/core/links/case.js +74 -0
- package/dist/core/links/case.js.map +1 -0
- package/dist/core/links/corpus.js +104 -0
- package/dist/core/links/corpus.js.map +1 -0
- package/dist/core/links/findings.js +110 -0
- package/dist/core/links/findings.js.map +1 -0
- package/dist/core/links/parse.js +236 -0
- package/dist/core/links/parse.js.map +1 -0
- package/dist/core/mcp/argv.js +111 -0
- package/dist/core/mcp/argv.js.map +1 -0
- package/dist/core/mcp/author-tools.js +72 -0
- package/dist/core/mcp/author-tools.js.map +1 -0
- package/dist/core/mcp/framing.js +46 -0
- package/dist/core/mcp/framing.js.map +1 -0
- package/dist/core/mcp/protocol.js +280 -0
- package/dist/core/mcp/protocol.js.map +1 -0
- package/dist/core/mcp/tools.js +314 -0
- package/dist/core/mcp/tools.js.map +1 -0
- package/dist/core/obligations/obligations.js +106 -0
- package/dist/core/obligations/obligations.js.map +1 -0
- package/dist/core/openapi/baseline/gate.js +166 -0
- package/dist/core/openapi/baseline/gate.js.map +1 -0
- package/dist/core/openapi/baseline/plan.js +112 -0
- package/dist/core/openapi/baseline/plan.js.map +1 -0
- package/dist/core/openapi/baseline/record.js +175 -0
- package/dist/core/openapi/baseline/record.js.map +1 -0
- package/dist/core/openapi/depth.js +122 -0
- package/dist/core/openapi/depth.js.map +1 -0
- package/dist/core/openapi/digest.js +189 -0
- package/dist/core/openapi/digest.js.map +1 -0
- package/dist/core/{openapi.js → openapi/doc.js} +44 -106
- package/dist/core/openapi/doc.js.map +1 -0
- package/dist/core/openapi/merge/components.js +234 -0
- package/dist/core/openapi/merge/components.js.map +1 -0
- package/dist/core/openapi/merge/error.js +26 -0
- package/dist/core/openapi/merge/error.js.map +1 -0
- package/dist/core/openapi/merge/markers.js +208 -0
- package/dist/core/openapi/merge/markers.js.map +1 -0
- package/dist/core/openapi/merge/merge.js +256 -0
- package/dist/core/openapi/merge/merge.js.map +1 -0
- package/dist/core/openapi/merge/pin.js +128 -0
- package/dist/core/openapi/merge/pin.js.map +1 -0
- package/dist/core/openspec/decide/capabilities.js +244 -0
- package/dist/core/openspec/decide/capabilities.js.map +1 -0
- package/dist/core/openspec/decide/dispositions.js +63 -0
- package/dist/core/openspec/decide/dispositions.js.map +1 -0
- package/dist/core/openspec/decide/renames.js +179 -0
- package/dist/core/openspec/decide/renames.js.map +1 -0
- package/dist/core/openspec/decide/verdict.js +84 -0
- package/dist/core/openspec/decide/verdict.js.map +1 -0
- package/dist/core/openspec/inventory.js +221 -0
- package/dist/core/openspec/inventory.js.map +1 -0
- package/dist/core/openspec/model/mapping.js +76 -0
- package/dist/core/openspec/model/mapping.js.map +1 -0
- package/dist/core/openspec/model/model.js +65 -0
- package/dist/core/openspec/model/model.js.map +1 -0
- package/dist/core/openspec/scan/changes.js +235 -0
- package/dist/core/openspec/scan/changes.js.map +1 -0
- package/dist/core/openspec/scan/config.js +200 -0
- package/dist/core/openspec/scan/config.js.map +1 -0
- package/dist/core/openspec/scan/shape.js +260 -0
- package/dist/core/openspec/scan/shape.js.map +1 -0
- package/dist/core/openspec/scan/walk.js +133 -0
- package/dist/core/openspec/scan/walk.js.map +1 -0
- package/dist/core/openspec/scan/workspace.js +71 -0
- package/dist/core/openspec/scan/workspace.js.map +1 -0
- package/dist/core/owners/codeowners.js +141 -0
- package/dist/core/owners/codeowners.js.map +1 -0
- package/dist/core/pack/features.js +120 -0
- package/dist/core/pack/features.js.map +1 -0
- package/dist/core/pack/joins.js +112 -0
- package/dist/core/pack/joins.js.map +1 -0
- package/dist/core/pack/living.js +137 -0
- package/dist/core/pack/living.js.map +1 -0
- package/dist/core/pack/pack.js +76 -0
- package/dist/core/pack/pack.js.map +1 -0
- package/dist/core/permissions/permissions.js +87 -0
- package/dist/core/permissions/permissions.js.map +1 -0
- package/dist/core/projection/api.js +84 -0
- package/dist/core/projection/api.js.map +1 -0
- package/dist/core/projection/arch-slice.js +63 -0
- package/dist/core/projection/arch-slice.js.map +1 -0
- package/dist/core/projection/events.js +34 -0
- package/dist/core/projection/events.js.map +1 -0
- package/dist/core/provenance/findings.js +208 -0
- package/dist/core/provenance/findings.js.map +1 -0
- package/dist/core/provenance/git.js +225 -0
- package/dist/core/provenance/git.js.map +1 -0
- package/dist/core/provenance/gitq/moves.js +182 -0
- package/dist/core/provenance/gitq/moves.js.map +1 -0
- package/dist/core/provenance/gitq/vouched-ancestor.js +179 -0
- package/dist/core/provenance/gitq/vouched-ancestor.js.map +1 -0
- package/dist/core/provenance/sample/scope.js +238 -0
- package/dist/core/provenance/sample/scope.js.map +1 -0
- package/dist/core/provenance/sample/sections.js +61 -0
- package/dist/core/provenance/sample/sections.js.map +1 -0
- package/dist/core/provenance/sources.js +263 -0
- package/dist/core/provenance/sources.js.map +1 -0
- package/dist/core/provenance/stamp.js +232 -0
- package/dist/core/provenance/stamp.js.map +1 -0
- package/dist/core/provenance/walk.js +157 -0
- package/dist/core/provenance/walk.js.map +1 -0
- package/dist/core/repo/authored/paths.js +210 -0
- package/dist/core/repo/authored/paths.js.map +1 -0
- package/dist/core/repo/entries.js +126 -0
- package/dist/core/repo/entries.js.map +1 -0
- package/dist/core/repo/paths.js +277 -0
- package/dist/core/repo/paths.js.map +1 -0
- package/dist/core/repo/repo.js +248 -0
- package/dist/core/repo/repo.js.map +1 -0
- package/dist/core/repo/service-target.js +153 -0
- package/dist/core/repo/service-target.js.map +1 -0
- package/dist/core/repo/state.js +58 -0
- package/dist/core/repo/state.js.map +1 -0
- package/dist/core/repo/tree/find.js +52 -0
- package/dist/core/repo/tree/find.js.map +1 -0
- package/dist/core/repo/tree/fs.js +64 -0
- package/dist/core/repo/tree/fs.js.map +1 -0
- package/dist/core/repo/tree/marker.js +61 -0
- package/dist/core/repo/tree/marker.js.map +1 -0
- package/dist/core/repo/tree/views.js +172 -0
- package/dist/core/repo/tree/views.js.map +1 -0
- package/dist/core/repo/tree/walk.js +234 -0
- package/dist/core/repo/tree/walk.js.map +1 -0
- package/dist/core/results.js +99 -2
- package/dist/core/results.js.map +1 -1
- package/dist/core/scaffold/landscape.js +131 -0
- package/dist/core/scaffold/landscape.js.map +1 -0
- package/dist/core/scaffold/readme.js +84 -0
- package/dist/core/scaffold/readme.js.map +1 -0
- package/dist/core/staging/commit.js +241 -0
- package/dist/core/staging/commit.js.map +1 -0
- package/dist/core/staging/interrupted.js +96 -0
- package/dist/core/staging/interrupted.js.map +1 -0
- package/dist/core/staging/lock.js +206 -0
- package/dist/core/staging/lock.js.map +1 -0
- package/dist/core/staging/recovery/finding.js +35 -0
- package/dist/core/staging/recovery/finding.js.map +1 -0
- package/dist/core/staging/recovery/intent.js +98 -0
- package/dist/core/staging/recovery/intent.js.map +1 -0
- package/dist/core/staging/recovery/recover.js +126 -0
- package/dist/core/staging/recovery/recover.js.map +1 -0
- package/dist/core/staging/recovery/residue.js +62 -0
- package/dist/core/staging/recovery/residue.js.map +1 -0
- package/dist/core/staging/snapshot.js +202 -0
- package/dist/core/staging/snapshot.js.map +1 -0
- package/dist/core/staging/txn/forward.js +171 -0
- package/dist/core/staging/txn/forward.js.map +1 -0
- package/dist/core/staging/txn/journal.js +139 -0
- package/dist/core/staging/txn/journal.js.map +1 -0
- package/dist/core/staging/txn/transaction.js +75 -0
- package/dist/core/staging/txn/transaction.js.map +1 -0
- package/dist/core/staging/writes.js +113 -0
- package/dist/core/staging/writes.js.map +1 -0
- package/dist/core/status/actions/execution.js +49 -0
- package/dist/core/status/actions/execution.js.map +1 -0
- package/dist/core/status/contracts.js +102 -0
- package/dist/core/status/contracts.js.map +1 -0
- package/dist/core/status/feature/artifacts.js +196 -0
- package/dist/core/status/feature/artifacts.js.map +1 -0
- package/dist/core/status/feature/feature.js +207 -0
- package/dist/core/status/feature/feature.js.map +1 -0
- package/dist/core/status/feature/next.js +150 -0
- package/dist/core/status/feature/next.js.map +1 -0
- package/dist/core/status/feature/state.js +21 -0
- package/dist/core/status/feature/state.js.map +1 -0
- package/dist/core/status/fleet/fleet.js +197 -0
- package/dist/core/status/fleet/fleet.js.map +1 -0
- package/dist/core/status/fleet/next.js +207 -0
- package/dist/core/status/fleet/next.js.map +1 -0
- package/dist/core/status/interrupted.js +97 -0
- package/dist/core/status/interrupted.js.map +1 -0
- package/dist/core/status/report.js +31 -0
- package/dist/core/status/report.js.map +1 -0
- package/dist/core/status/scan.js +41 -0
- package/dist/core/status/scan.js.map +1 -0
- package/dist/core/status/verification.js +201 -0
- package/dist/core/status/verification.js.map +1 -0
- package/dist/core/usecases/capability.js +169 -0
- package/dist/core/usecases/capability.js.map +1 -0
- package/dist/core/usecases/delta/claims.js +116 -0
- package/dist/core/usecases/delta/claims.js.map +1 -0
- package/dist/core/usecases/delta/flows.js +103 -0
- package/dist/core/usecases/delta/flows.js.map +1 -0
- package/dist/core/usecases/delta/overlay.js +72 -0
- package/dist/core/usecases/delta/overlay.js.map +1 -0
- package/dist/core/usecases/fleet.js +137 -0
- package/dist/core/usecases/fleet.js.map +1 -0
- package/dist/core/usecases/operations.js +111 -0
- package/dist/core/usecases/operations.js.map +1 -0
- package/dist/core/usecases/place.js +44 -0
- package/dist/core/usecases/place.js.map +1 -0
- package/dist/core/usecases/touch.js +101 -0
- package/dist/core/usecases/touch.js.map +1 -0
- package/dist/core/verify/answers.js +173 -0
- package/dist/core/verify/answers.js.map +1 -0
- package/dist/core/verify/build.js +150 -0
- package/dist/core/verify/build.js.map +1 -0
- package/dist/core/verify/checklist.js +201 -0
- package/dist/core/verify/checklist.js.map +1 -0
- package/dist/core/verify/claims/identity.js +61 -0
- package/dist/core/verify/claims/identity.js.map +1 -0
- package/dist/core/verify/cross/diff.js +97 -0
- package/dist/core/verify/cross/diff.js.map +1 -0
- package/dist/core/verify/evidence/contract.js +169 -0
- package/dist/core/verify/evidence/contract.js.map +1 -0
- package/dist/core/verify/file.js +257 -0
- package/dist/core/verify/file.js.map +1 -0
- package/dist/core/verify/pins/lint.js +157 -0
- package/dist/core/verify/pins/lint.js.map +1 -0
- package/dist/core/verify/pins/pin.js +95 -0
- package/dist/core/verify/pins/pin.js.map +1 -0
- package/dist/core/verify/record.js +142 -0
- package/dist/core/verify/record.js.map +1 -0
- package/dist/core/verify/store/commit.js +89 -0
- package/dist/core/verify/store/commit.js.map +1 -0
- package/dist/core/verify/store/render.js +57 -0
- package/dist/core/verify/store/render.js.map +1 -0
- package/dist/core/vocabulary/health.js +91 -0
- package/dist/core/vocabulary/health.js.map +1 -0
- package/dist/core/vocabulary/issue.js +58 -0
- package/dist/core/vocabulary/issue.js.map +1 -0
- package/dist/core/vocabulary/maturity.js +145 -0
- package/dist/core/vocabulary/maturity.js.map +1 -0
- package/dist/core/{report.js → vocabulary/report.js} +30 -2
- package/dist/core/vocabulary/report.js.map +1 -0
- package/dist/core/vocabulary/steps.js +266 -0
- package/dist/core/vocabulary/steps.js.map +1 -0
- package/dist/core/workspace/discover.js +239 -0
- package/dist/core/workspace/discover.js.map +1 -0
- package/dist/core/workspace/render.js +52 -0
- package/dist/core/workspace/render.js.map +1 -0
- package/examples/README.md +189 -0
- package/examples/docs/architecture/adrs/0001-transactional-outbox.md +33 -0
- package/examples/docs/architecture/capabilities.yaml +31 -0
- package/examples/docs/architecture/landscape.likec4 +280 -0
- package/examples/docs/architecture/obligations.yaml +23 -0
- package/examples/docs/architecture/permissions.yaml +50 -0
- package/examples/docs/architecture/subsystems.likec4 +11 -0
- package/examples/docs/architecture/usecases/order-notification.likec4 +65 -0
- package/examples/docs/capabilities/checkout/spec.md +55 -0
- package/examples/docs/capabilities/identity/tokens/spec.md +42 -0
- package/examples/docs/capabilities/order-notifications/spec.md +43 -0
- package/examples/docs/features/FEAT-101-payment-splitting/adrs/0001-dedicated-split-service.md +18 -0
- package/examples/docs/features/FEAT-101-payment-splitting/delta.likec4 +94 -0
- package/examples/docs/features/FEAT-101-payment-splitting/intent.md +44 -0
- package/examples/docs/features/FEAT-101-payment-splitting/specs/checkout-web/spec.md +21 -0
- package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-service/asyncapi.yaml +129 -0
- package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-service/spec.md +36 -0
- package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-split-service/arch.spec.md +40 -0
- package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-split-service/openapi.yaml +116 -0
- package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-split-service/spec.md +55 -0
- package/examples/docs/features/FEAT-112-retire-order-v1/intent.md +35 -0
- package/examples/docs/features/FEAT-112-retire-order-v1/specs/order-service/openapi.yaml +28 -0
- package/examples/docs/features/FEAT-112-retire-order-v1/specs/order-service/spec.md +17 -0
- package/examples/docs/features/archive/FEAT-088-refunds/.loam-before/files/architecture/landscape.likec4 +253 -0
- package/examples/docs/features/archive/FEAT-088-refunds/.loam-before/files/services/order-service/spec.md +121 -0
- package/examples/docs/features/archive/FEAT-088-refunds/.loam-before/files/services/payment-service/openapi.yaml +111 -0
- package/examples/docs/features/archive/FEAT-088-refunds/.loam-before/files/services/payment-service/spec.md +58 -0
- package/examples/docs/features/archive/FEAT-088-refunds/.loam-before/manifest.json +32 -0
- package/examples/docs/features/archive/FEAT-088-refunds/adrs/0001-refunds-stay-in-payment-service.md +26 -0
- package/examples/docs/features/archive/FEAT-088-refunds/delta.likec4 +28 -0
- package/examples/docs/features/archive/FEAT-088-refunds/intent.md +26 -0
- package/examples/docs/features/archive/FEAT-088-refunds/specs/order-service/spec.md +37 -0
- package/examples/docs/features/archive/FEAT-088-refunds/specs/payment-service/openapi.yaml +70 -0
- package/examples/docs/features/archive/FEAT-088-refunds/specs/payment-service/spec.md +23 -0
- package/examples/docs/features/archive/FEAT-088-refunds/verification.yaml +76 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/files/architecture/landscape.likec4 +275 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/files/services/payment-service/asyncapi.yaml +96 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/files/services/payment-service/spec.md +82 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/files/services/platform/notification-service/asyncapi.yaml +164 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/files/services/platform/notification-service/spec.md +91 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/manifest.json +46 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/delta.likec4 +36 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/intent.md +22 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/scenario-report.json +10 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/specs/notification-service/asyncapi.yaml +208 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/specs/notification-service/spec.md +24 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/specs/payment-service/asyncapi.yaml +137 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/specs/payment-service/spec.md +31 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/verification.yaml +84 -0
- package/examples/docs/glossary/order.md +15 -0
- package/examples/docs/glossary/payments/authorization.md +14 -0
- package/examples/docs/likec4.config.json +9 -0
- package/examples/docs/loam.json +3 -0
- package/examples/docs/services/checkout-web/model.likec4 +109 -0
- package/examples/docs/services/checkout-web/spec.md +91 -0
- package/examples/docs/services/checkout-web/ui/pages/checkout.page.yaml +40 -0
- package/examples/docs/services/checkout-web/ui/pages/order-status.page.yaml +24 -0
- package/examples/docs/services/checkout-web/ui/pages/split-payment.page.yaml +26 -0
- package/examples/docs/services/order-service/adrs/0001-orchestrated-order-lifecycle.md +52 -0
- package/examples/docs/services/order-service/arch.spec.md +127 -0
- package/examples/docs/services/order-service/asyncapi.yaml +108 -0
- package/examples/docs/services/order-service/health.yaml +57 -0
- package/examples/docs/services/order-service/model.likec4 +138 -0
- package/examples/docs/services/order-service/openapi.yaml +257 -0
- package/examples/docs/services/order-service/runbook.md +62 -0
- package/examples/docs/services/order-service/spec.md +134 -0
- package/examples/docs/services/payment-service/adrs/0001-payments-outbox.md +18 -0
- package/examples/docs/services/payment-service/adrs/0002-idempotency-keys-on-authorization.md +27 -0
- package/examples/docs/services/payment-service/arch.spec.md +73 -0
- package/examples/docs/services/payment-service/asyncapi.yaml +130 -0
- package/examples/docs/services/payment-service/health.yaml +39 -0
- package/examples/docs/services/payment-service/model.likec4 +67 -0
- package/examples/docs/services/payment-service/openapi.yaml +151 -0
- package/examples/docs/services/payment-service/runbook.md +37 -0
- package/examples/docs/services/payment-service/spec.md +88 -0
- package/examples/docs/services/platform/identity-service/adrs/0001-token-introspection-over-local-validation.md +60 -0
- package/examples/docs/services/platform/identity-service/arch.spec.md +117 -0
- package/examples/docs/services/platform/identity-service/health.yaml +70 -0
- package/examples/docs/services/platform/identity-service/model.likec4 +83 -0
- package/examples/docs/services/platform/identity-service/openapi.yaml +197 -0
- package/examples/docs/services/platform/identity-service/runbook.md +95 -0
- package/examples/docs/services/platform/identity-service/spec.md +119 -0
- package/examples/docs/services/platform/notification-service/asyncapi.yaml +199 -0
- package/examples/docs/services/platform/notification-service/health.yaml +35 -0
- package/examples/docs/services/platform/notification-service/model.likec4 +118 -0
- package/examples/docs/services/platform/notification-service/runbook.md +48 -0
- package/examples/docs/services/platform/notification-service/spec.md +112 -0
- package/examples/docs/services/platform/subsystem.yaml +2 -0
- package/examples/fleet.yaml +57 -0
- package/package.json +19 -6
- package/dist/commands/adopt.js +0 -240
- package/dist/commands/adopt.js.map +0 -1
- package/dist/commands/archive.js +0 -1313
- package/dist/commands/archive.js.map +0 -1
- package/dist/commands/delta.js +0 -388
- package/dist/commands/delta.js.map +0 -1
- package/dist/commands/docs-repo-gate.js.map +0 -1
- package/dist/commands/format.js +0 -17
- package/dist/commands/format.js.map +0 -1
- package/dist/commands/gherkin.js +0 -309
- package/dist/commands/gherkin.js.map +0 -1
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/list.js +0 -295
- package/dist/commands/list.js.map +0 -1
- package/dist/commands/migrate-openspec.js +0 -950
- package/dist/commands/migrate-openspec.js.map +0 -1
- package/dist/commands/new.js +0 -413
- package/dist/commands/new.js.map +0 -1
- package/dist/commands/rebase.js +0 -356
- package/dist/commands/rebase.js.map +0 -1
- package/dist/commands/show.js.map +0 -1
- package/dist/commands/status.js +0 -262
- package/dist/commands/status.js.map +0 -1
- package/dist/commands/unarchive.js.map +0 -1
- package/dist/commands/validate.js +0 -1773
- package/dist/commands/validate.js.map +0 -1
- package/dist/commands/verify.js +0 -775
- package/dist/commands/verify.js.map +0 -1
- package/dist/commands/vouch.js +0 -421
- package/dist/commands/vouch.js.map +0 -1
- package/dist/core/agent.js +0 -2173
- package/dist/core/agent.js.map +0 -1
- package/dist/core/agents-stamp.js.map +0 -1
- package/dist/core/arch.js +0 -130
- package/dist/core/arch.js.map +0 -1
- package/dist/core/asyncapi.js.map +0 -1
- package/dist/core/brief.js +0 -755
- package/dist/core/brief.js.map +0 -1
- package/dist/core/coherence.js +0 -577
- package/dist/core/coherence.js.map +0 -1
- package/dist/core/concurrency.js.map +0 -1
- package/dist/core/config.js.map +0 -1
- package/dist/core/delta.js +0 -476
- package/dist/core/delta.js.map +0 -1
- package/dist/core/dependencies.js +0 -356
- package/dist/core/dependencies.js.map +0 -1
- package/dist/core/doctor.js +0 -596
- package/dist/core/doctor.js.map +0 -1
- package/dist/core/document-bytes.js.map +0 -1
- package/dist/core/explore.js.map +0 -1
- package/dist/core/frontmatter.js.map +0 -1
- package/dist/core/gherkin.js +0 -463
- package/dist/core/gherkin.js.map +0 -1
- package/dist/core/health.js +0 -67
- package/dist/core/health.js.map +0 -1
- package/dist/core/ids.js +0 -122
- package/dist/core/ids.js.map +0 -1
- package/dist/core/issue.js +0 -9
- package/dist/core/issue.js.map +0 -1
- package/dist/core/json.js +0 -74
- package/dist/core/json.js.map +0 -1
- package/dist/core/likec4.js +0 -489
- package/dist/core/likec4.js.map +0 -1
- package/dist/core/maturity.js +0 -66
- package/dist/core/maturity.js.map +0 -1
- package/dist/core/openapi-merge.js +0 -552
- package/dist/core/openapi-merge.js.map +0 -1
- package/dist/core/openapi.js.map +0 -1
- package/dist/core/openspec-inventory.js +0 -1440
- package/dist/core/openspec-inventory.js.map +0 -1
- package/dist/core/path-safety.js.map +0 -1
- package/dist/core/provenance.js +0 -787
- package/dist/core/provenance.js.map +0 -1
- package/dist/core/records.js.map +0 -1
- package/dist/core/repo.js +0 -438
- package/dist/core/repo.js.map +0 -1
- package/dist/core/report.js.map +0 -1
- package/dist/core/spec.js +0 -505
- package/dist/core/spec.js.map +0 -1
- package/dist/core/staging.js +0 -890
- package/dist/core/staging.js.map +0 -1
- package/dist/core/status.js +0 -1132
- package/dist/core/status.js.map +0 -1
- package/dist/core/steps.js +0 -72
- package/dist/core/steps.js.map +0 -1
- package/dist/core/verify.js +0 -807
- package/dist/core/verify.js.map +0 -1
- package/dist/core/version.js.map +0 -1
- /package/dist/core/{concurrency.js → kernel/concurrency.js} +0 -0
- /package/dist/core/{records.js → kernel/records.js} +0 -0
package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-split-service/openapi.yaml
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# API delta for FEAT-101 — payment-split-service (new) gains the split API.
|
|
2
|
+
# On `loam archive` this folds into services/payment-split-service/openapi.yaml (living).
|
|
3
|
+
#
|
|
4
|
+
# A feature contract is a COMPLETE document, not a patch: the author restates the living
|
|
5
|
+
# contract around the slot being changed, and the merge upserts every operation the document
|
|
6
|
+
# spells. Both operations here are new, so neither carries an `x-loam-based-on` pin — there is
|
|
7
|
+
# no living operation for a pin to be the digest of. On a service that already exists, every
|
|
8
|
+
# quoted operation carries one, written by `loam rebase`, and an unpinned restatement is exactly
|
|
9
|
+
# the shape that silently reverts whoever landed in between.
|
|
10
|
+
openapi: 3.1.0
|
|
11
|
+
info:
|
|
12
|
+
title: payment-split-service
|
|
13
|
+
version: "1.0"
|
|
14
|
+
paths:
|
|
15
|
+
/splits:
|
|
16
|
+
post:
|
|
17
|
+
operationId: createSplit
|
|
18
|
+
summary: Create a split of a payment across payees
|
|
19
|
+
requestBody:
|
|
20
|
+
required: true
|
|
21
|
+
content:
|
|
22
|
+
application/json:
|
|
23
|
+
schema:
|
|
24
|
+
$ref: '#/components/schemas/SplitRequest'
|
|
25
|
+
responses:
|
|
26
|
+
"201":
|
|
27
|
+
description: Split created
|
|
28
|
+
content:
|
|
29
|
+
application/json:
|
|
30
|
+
schema:
|
|
31
|
+
$ref: '#/components/schemas/Split'
|
|
32
|
+
"422":
|
|
33
|
+
description: The shares do not sum to the payment total
|
|
34
|
+
content:
|
|
35
|
+
application/json:
|
|
36
|
+
schema:
|
|
37
|
+
$ref: '#/components/schemas/Problem'
|
|
38
|
+
/splits/{id}:
|
|
39
|
+
parameters:
|
|
40
|
+
- name: id
|
|
41
|
+
in: path
|
|
42
|
+
required: true
|
|
43
|
+
schema:
|
|
44
|
+
type: string
|
|
45
|
+
format: uuid
|
|
46
|
+
get:
|
|
47
|
+
operationId: getSplit
|
|
48
|
+
summary: Read a recorded split
|
|
49
|
+
responses:
|
|
50
|
+
"200":
|
|
51
|
+
description: The split and its shares
|
|
52
|
+
content:
|
|
53
|
+
application/json:
|
|
54
|
+
schema:
|
|
55
|
+
$ref: '#/components/schemas/Split'
|
|
56
|
+
"404":
|
|
57
|
+
description: No such split
|
|
58
|
+
content:
|
|
59
|
+
application/json:
|
|
60
|
+
schema:
|
|
61
|
+
$ref: '#/components/schemas/Problem'
|
|
62
|
+
|
|
63
|
+
components:
|
|
64
|
+
schemas:
|
|
65
|
+
SplitRequest:
|
|
66
|
+
type: object
|
|
67
|
+
required: [orderId, currency, shares]
|
|
68
|
+
properties:
|
|
69
|
+
orderId:
|
|
70
|
+
type: string
|
|
71
|
+
currency:
|
|
72
|
+
type: string
|
|
73
|
+
pattern: '^[A-Z]{3}$'
|
|
74
|
+
shares:
|
|
75
|
+
type: array
|
|
76
|
+
minItems: 2
|
|
77
|
+
items:
|
|
78
|
+
$ref: '#/components/schemas/Share'
|
|
79
|
+
Split:
|
|
80
|
+
type: object
|
|
81
|
+
required: [splitId, orderId, currency, shares]
|
|
82
|
+
properties:
|
|
83
|
+
splitId:
|
|
84
|
+
type: string
|
|
85
|
+
format: uuid
|
|
86
|
+
orderId:
|
|
87
|
+
type: string
|
|
88
|
+
currency:
|
|
89
|
+
type: string
|
|
90
|
+
pattern: '^[A-Z]{3}$'
|
|
91
|
+
shares:
|
|
92
|
+
type: array
|
|
93
|
+
items:
|
|
94
|
+
$ref: '#/components/schemas/Share'
|
|
95
|
+
Share:
|
|
96
|
+
type: object
|
|
97
|
+
required: [payee, amount]
|
|
98
|
+
properties:
|
|
99
|
+
payee:
|
|
100
|
+
type: string
|
|
101
|
+
amount:
|
|
102
|
+
type: integer
|
|
103
|
+
description: minor units
|
|
104
|
+
Problem:
|
|
105
|
+
type: object
|
|
106
|
+
required: [type, title, status]
|
|
107
|
+
properties:
|
|
108
|
+
type:
|
|
109
|
+
type: string
|
|
110
|
+
format: uri
|
|
111
|
+
title:
|
|
112
|
+
type: string
|
|
113
|
+
status:
|
|
114
|
+
type: integer
|
|
115
|
+
detail:
|
|
116
|
+
type: string
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# payment-split-service — requirement delta for FEAT-101
|
|
2
|
+
|
|
3
|
+
A delta is reviewed as a diff. Every requirement below sits under an `## ADDED|MODIFIED|REMOVED
|
|
4
|
+
Requirements` heading, which is what gives it a kind: a requirement under any other H2 merges as
|
|
5
|
+
nothing, and `delta.requirement-not-merged` names it rather than letting authored text vanish.
|
|
6
|
+
|
|
7
|
+
## ADDED Requirements
|
|
8
|
+
|
|
9
|
+
### Requirement: Split a payment
|
|
10
|
+
|
|
11
|
+
Requirement-ID: SPL-SPLIT
|
|
12
|
+
The service SHALL split a payment across two or more payees such that the shares sum to the
|
|
13
|
+
total, and SHALL refuse a split whose shares do not.
|
|
14
|
+
|
|
15
|
+
Operations: createSplit
|
|
16
|
+
|
|
17
|
+
#### Scenario: Split across two payees
|
|
18
|
+
- **Given** a payment of 100.00 USD for order "A-1"
|
|
19
|
+
- **When** it is split 60.00 to "seller-x" and 40.00 to "seller-y"
|
|
20
|
+
- **Then** a split with two shares summing to 100.00 is recorded
|
|
21
|
+
- **And** a `PaymentSplit` event is published to kafka
|
|
22
|
+
|
|
23
|
+
#### Scenario: Reject a split that does not sum to the total
|
|
24
|
+
- **Given** a payment of 100.00 USD
|
|
25
|
+
- **When** a split of 60.00 + 30.00 is requested
|
|
26
|
+
- **Then** the split is refused with 422 and the shares that were sent are echoed back
|
|
27
|
+
|
|
28
|
+
#### Scenario: Split across many payees
|
|
29
|
+
- **Given** a payment of 100.00 USD for order "A-1"
|
|
30
|
+
- **When** it is split across the payees below
|
|
31
|
+
- **Then** a split with those shares is recorded
|
|
32
|
+
|
|
33
|
+
| payee | share |
|
|
34
|
+
|----------|-------|
|
|
35
|
+
| seller-x | 50.00 |
|
|
36
|
+
| seller-y | 30.00 |
|
|
37
|
+
| seller-z | 20.00 |
|
|
38
|
+
|
|
39
|
+
### Requirement: Read a split
|
|
40
|
+
|
|
41
|
+
Requirement-ID: SPL-READ
|
|
42
|
+
The service SHALL return a recorded split with its shares, so that checkout can show a customer
|
|
43
|
+
what was agreed before confirmation.
|
|
44
|
+
|
|
45
|
+
Operations: getSplit
|
|
46
|
+
|
|
47
|
+
#### Scenario: Read a recorded split
|
|
48
|
+
- **Given** a split recorded for order "A-1"
|
|
49
|
+
- **When** it is requested by its id
|
|
50
|
+
- **Then** its shares and their payees are returned
|
|
51
|
+
|
|
52
|
+
#### Scenario: Read a split that does not exist
|
|
53
|
+
- **Given** a split id nothing ever recorded
|
|
54
|
+
- **When** it is requested
|
|
55
|
+
- **Then** the request is refused with 404
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
feature: FEAT-112
|
|
3
|
+
title: Retire the v1 order API
|
|
4
|
+
status: in_progress
|
|
5
|
+
owner: orders-team
|
|
6
|
+
services: [order-service]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# FEAT-112 — Retire the v1 order API
|
|
10
|
+
|
|
11
|
+
## Why
|
|
12
|
+
`createOrderV1` was deprecated when `createOrder` shipped with idempotency keys and a currency
|
|
13
|
+
field. The last caller — a partner integration — moved in June, and the operation has served no
|
|
14
|
+
traffic since. Leaving it declared is not free: it is a live surface with its own validation
|
|
15
|
+
path, and `api.requirement-deprecated` has been warning on the requirement that governs it ever
|
|
16
|
+
since the flag went on.
|
|
17
|
+
|
|
18
|
+
## Business acceptance
|
|
19
|
+
- `POST /v1/orders` no longer exists.
|
|
20
|
+
- No behaviour reachable only through the v1 path is lost: `createOrder` accepts everything the
|
|
21
|
+
v1 request could express.
|
|
22
|
+
|
|
23
|
+
## Architectural summary
|
|
24
|
+
This feature is the **smallest legal shape** loam accepts, and deliberately so: it changes no
|
|
25
|
+
boxes and no edges, so there is no `delta.likec4` at all — an absent architecture axis is a
|
|
26
|
+
legible statement that the architecture is unchanged, and the merge simply has nothing to do
|
|
27
|
+
there. (A file that *declares* elements with none carrying the feature tag would be
|
|
28
|
+
`delta.nothing-tagged` instead: declared-but-untagged is almost always a forgotten tag.)
|
|
29
|
+
|
|
30
|
+
What it does carry is the two halves of an explicit removal, which loam requires together:
|
|
31
|
+
a `REMOVED` requirement whose `Operations:` line names the operation, and an
|
|
32
|
+
`x-loam-remove: true` marker inside that operation object in `specs/order-service/openapi.yaml`.
|
|
33
|
+
Either half alone is refused — a marker with no requirement is `openapi.remove-marker-unjustified`,
|
|
34
|
+
a `REMOVED` requirement with no marker is `openapi.remove-marker-missing` — because a contract
|
|
35
|
+
shrinking with nothing to point at is how a consumer finds out by outage.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# API delta for FEAT-112 — order-service retires `createOrderV1`.
|
|
2
|
+
#
|
|
3
|
+
# A removal is spelled as the exact living path and HTTP method, the operationId kept, and
|
|
4
|
+
# `x-loam-remove: true` INSIDE the operation object beside it. Three things are load-bearing:
|
|
5
|
+
#
|
|
6
|
+
# - the path+method must address a living operation (`openapi.remove-target-missing`);
|
|
7
|
+
# - the operationId must be the one living at that slot (`openapi.remove-target-mismatch`);
|
|
8
|
+
# - the marker must sit at operation level, not one level up beside the methods, where it
|
|
9
|
+
# names no operation and retires nothing (`openapi.remove-marker-path-level`).
|
|
10
|
+
#
|
|
11
|
+
# The marker never reaches the living contract — archive strips `x-loam-remove` and
|
|
12
|
+
# `x-loam-based-on` on every merge branch — and a path item consisting of nothing but a marker
|
|
13
|
+
# publishes no phantom path. Archive deletes only the matching method, and deliberately does not
|
|
14
|
+
# garbage-collect the components the operation used: another operation may still reference them,
|
|
15
|
+
# and a merge is not the place to decide that.
|
|
16
|
+
#
|
|
17
|
+
# Removal markers carry no baseline pin, unlike the operations a feature edits:
|
|
18
|
+
# `openapi.remove-target-mismatch` already checks that exact slot, which is the same question a
|
|
19
|
+
# pin would answer.
|
|
20
|
+
openapi: 3.1.0
|
|
21
|
+
info:
|
|
22
|
+
title: order-service
|
|
23
|
+
version: "1.0"
|
|
24
|
+
paths:
|
|
25
|
+
/v1/orders:
|
|
26
|
+
post:
|
|
27
|
+
operationId: createOrderV1
|
|
28
|
+
x-loam-remove: true
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# order-service — requirement delta for FEAT-112
|
|
2
|
+
|
|
3
|
+
## REMOVED Requirements
|
|
4
|
+
|
|
5
|
+
### Requirement: Accept an order through the v1 API
|
|
6
|
+
|
|
7
|
+
Requirement-ID: ORD-PLACE-V1
|
|
8
|
+
Based-On: 3671415e0f4d7b13
|
|
9
|
+
The service SHALL accept an order through the pre-idempotency `/v1/orders` path for the one
|
|
10
|
+
partner integration that has not migrated.
|
|
11
|
+
|
|
12
|
+
Operations: createOrderV1
|
|
13
|
+
|
|
14
|
+
#### Scenario: A partner places an order through the v1 path
|
|
15
|
+
- **Given** a partner request with no idempotency key
|
|
16
|
+
- **When** it is posted to the v1 path
|
|
17
|
+
- **Then** an order is created and its id is returned
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
// Global C4 fleet landscape — the LIVING current state.
|
|
2
|
+
// `loam archive` folds a feature's #FEAT-tagged elements/relationships in here.
|
|
3
|
+
// One landscape file, by decision: conflicts resolve through PRs. See SCHEMA.md,
|
|
4
|
+
// "Operating at fleet scale", for the trigger that would change this.
|
|
5
|
+
//
|
|
6
|
+
// `loam validate --all` cross-checks this file against services/: every service
|
|
7
|
+
// directory needs an element here (error), and every element that looks like a
|
|
8
|
+
// service needs a directory (warning). An element is tied to its directory by
|
|
9
|
+
// `metadata { service '<id>' }`, or by its title when there is no binding.
|
|
10
|
+
// Systems that are not ours carry #external and are exempt.
|
|
11
|
+
specification {
|
|
12
|
+
// A grouping element — it stands for no service and owns no directory. The
|
|
13
|
+
// service checks WALK the tree rather than reading only top-level elements:
|
|
14
|
+
// an element is graded at service level when no ancestor already stands for a
|
|
15
|
+
// service, so nesting the fleet inside a boundary costs nothing, and the
|
|
16
|
+
// group itself never raises `landscape.service-undocumented` because it
|
|
17
|
+
// CONTAINS services rather than being one.
|
|
18
|
+
element group
|
|
19
|
+
element softwareSystem
|
|
20
|
+
// Declared here because archive SPLICES a delta's additions verbatim: FEAT-101's
|
|
21
|
+
// new system carries its `api` container along, and the kind has to be legal in
|
|
22
|
+
// THIS document for the merged landscape to parse (archive refuses otherwise).
|
|
23
|
+
element container
|
|
24
|
+
element person
|
|
25
|
+
// A topic is an element, and the kind carries #external rather than each
|
|
26
|
+
// instance doing it: LikeC4 does NOT inherit tags, so a topic nested inside
|
|
27
|
+
// the #external broker is not external itself, and `loam validate --all`
|
|
28
|
+
// would ask for a services/payment.events/ nobody owes
|
|
29
|
+
// (`landscape.service-undocumented`).
|
|
30
|
+
element topic {
|
|
31
|
+
#external
|
|
32
|
+
// The channel is platform too, and the tag has to be HERE rather than on
|
|
33
|
+
// the broker alone: `landscape.platform-candidate` grades each drawn
|
|
34
|
+
// element by how many services consume it, and once the edges point at
|
|
35
|
+
// topics it is the topics that collect three consumers each — tagging only
|
|
36
|
+
// `kafka` would leave three untagged hubs behind.
|
|
37
|
+
#platform
|
|
38
|
+
style {
|
|
39
|
+
shape queue
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
tag external
|
|
43
|
+
// Ubiquitous infrastructure. Three consuming services is where an untagged
|
|
44
|
+
// external hub starts warning (`landscape.platform-candidate`), because that
|
|
45
|
+
// is where one more edge per modelled service stops being a fact about two
|
|
46
|
+
// services and starts being the shape of the map. Tagging keeps both pictures:
|
|
47
|
+
// the fleet view below excludes #platform, and the platform view keeps "who
|
|
48
|
+
// depends on it" answerable during an incident. LikeC4 refuses an undeclared
|
|
49
|
+
// tag, so the declaration here and the tag on the element are both needed.
|
|
50
|
+
tag platform
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
model {
|
|
54
|
+
customer = person 'Customer'
|
|
55
|
+
|
|
56
|
+
// Our own fleet, drawn inside a boundary the way ordinary grouped C4 is. The
|
|
57
|
+
// group has no `metadata { service }` and no directory under services/: it is
|
|
58
|
+
// scenery for the reader, and every check below resolves through it to the
|
|
59
|
+
// element that really stands for each service.
|
|
60
|
+
marketplace = group 'Marketplace' {
|
|
61
|
+
description 'Everything this organisation runs'
|
|
62
|
+
|
|
63
|
+
checkoutWeb = softwareSystem 'checkout-web' {
|
|
64
|
+
description 'Customer-facing checkout UI'
|
|
65
|
+
metadata {
|
|
66
|
+
service 'checkout-web'
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
orderService = softwareSystem 'order-service' {
|
|
70
|
+
description 'Owns the order lifecycle'
|
|
71
|
+
metadata {
|
|
72
|
+
service 'order-service'
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
paymentService = softwareSystem 'payment-service' {
|
|
76
|
+
description 'Owns payment authorization/capture'
|
|
77
|
+
metadata {
|
|
78
|
+
service 'payment-service'
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
identityService = softwareSystem 'identity-service' {
|
|
82
|
+
description 'Issues and introspects access tokens'
|
|
83
|
+
metadata {
|
|
84
|
+
service 'identity-service'
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
notificationService = softwareSystem 'notification-service' {
|
|
88
|
+
description 'Turns events into customer email and push'
|
|
89
|
+
metadata {
|
|
90
|
+
service 'notification-service'
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
kafka = softwareSystem 'kafka' {
|
|
96
|
+
// Not one of ours: no services/kafka/ is expected, and none is asked for.
|
|
97
|
+
#external
|
|
98
|
+
// Three of our services reach it, which is exactly the count at which the
|
|
99
|
+
// untagged version of this element becomes `landscape.platform-candidate`.
|
|
100
|
+
#platform
|
|
101
|
+
description 'Event backbone'
|
|
102
|
+
// Edges point HERE, not at the broker. Two producers make no difference;
|
|
103
|
+
// sixty do — a broker drawn as one element is the node every service in the
|
|
104
|
+
// fleet points at, and a view over it is a star nobody can read. The topic
|
|
105
|
+
// is also the truer target: what a producer and a consumer share is the
|
|
106
|
+
// channel, never the server it happens to live on.
|
|
107
|
+
paymentEvents = topic 'payment.events'
|
|
108
|
+
orderEvents = topic 'order.events'
|
|
109
|
+
crmEvents = topic 'crm.events'
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
stripe = softwareSystem 'stripe' {
|
|
113
|
+
#external
|
|
114
|
+
description 'Card acquirer'
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
salesforce = softwareSystem 'salesforce' {
|
|
118
|
+
#external
|
|
119
|
+
description 'CRM of record — the fleet reads its events and writes none'
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
customer -> marketplace.checkoutWeb 'Uses'
|
|
123
|
+
|
|
124
|
+
// The synchronous spine. Every one of these resolves against the TARGET's
|
|
125
|
+
// openapi.yaml: `loam validate` fails the fleet when an `op` names an
|
|
126
|
+
// operation the callee does not define (`spine.op-undefined`), which is what
|
|
127
|
+
// turns a rename in one repository into a red build in the one that depended
|
|
128
|
+
// on it.
|
|
129
|
+
marketplace.checkoutWeb -> marketplace.orderService 'Calls createOrder' {
|
|
130
|
+
metadata {
|
|
131
|
+
op 'createOrder'
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
marketplace.checkoutWeb -> marketplace.orderService 'Calls getOrder' {
|
|
135
|
+
metadata {
|
|
136
|
+
op 'getOrder'
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// Deliberately unlinked, and the example's demonstration of
|
|
140
|
+
// `spine.op-link-missing` (warn): an edge whose title starts with "Call" and
|
|
141
|
+
// carries no `metadata { op }` is drawn but joined to nothing, so no check can
|
|
142
|
+
// tell whether the operation behind it still exists. Every other call edge
|
|
143
|
+
// here carries its op; this one is what the warning looks like.
|
|
144
|
+
marketplace.checkoutWeb -> marketplace.paymentService 'Calls the payment API'
|
|
145
|
+
marketplace.orderService -> marketplace.paymentService 'Calls authorizePayment' {
|
|
146
|
+
metadata {
|
|
147
|
+
op 'authorizePayment'
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
marketplace.orderService -> marketplace.identityService 'Calls introspectToken' {
|
|
151
|
+
metadata {
|
|
152
|
+
op 'introspectToken'
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
// The other half of the deprecation story, and the example's
|
|
156
|
+
// `spine.op-deprecated` (warn): identity-service still DEFINES validateToken,
|
|
157
|
+
// so the contract holds and this is not an error — but its OpenAPI marks the
|
|
158
|
+
// operation `deprecated: true`, and this edge is the consumer that has not
|
|
159
|
+
// migrated yet. The warning is addressed to payment-service, not to identity.
|
|
160
|
+
marketplace.paymentService -> marketplace.identityService 'Calls validateToken' {
|
|
161
|
+
metadata {
|
|
162
|
+
op 'validateToken'
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
// An edge into a system nobody owns a directory for. It carries no `op`
|
|
166
|
+
// because there is no contract in this repository to resolve one against, and
|
|
167
|
+
// it raises no warning because its title does not claim to be a call into a
|
|
168
|
+
// fleet service.
|
|
169
|
+
marketplace.paymentService -> stripe 'Authorizes cards'
|
|
170
|
+
|
|
171
|
+
// The event spine, the async mirror of `metadata { op }`: the name must be a
|
|
172
|
+
// message the PRODUCER's own asyncapi.yaml declares an `action: send` for, or
|
|
173
|
+
// `spine.message-undefined` fires. A consumer's edge carries
|
|
174
|
+
// `metadata { consumes }` instead, and its name has to have a producer
|
|
175
|
+
// SOMEWHERE in the fleet — the one check no single repository can answer.
|
|
176
|
+
//
|
|
177
|
+
// THE ARROW FOLLOWS THE MESSAGE, and that is load-bearing rather than
|
|
178
|
+
// aesthetic. `publishes` binds the edge's SOURCE and `consumes` binds its
|
|
179
|
+
// TARGET, so a consume edge drawn the other way round — `orderService ->
|
|
180
|
+
// kafka.paymentEvents` — binds to nothing at all: the metadata parses, the
|
|
181
|
+
// document validates, and the check silently grades zero edges. Producer to
|
|
182
|
+
// topic, topic to consumer, every time.
|
|
183
|
+
marketplace.paymentService -> kafka.paymentEvents 'Publishes PaymentAuthorized' {
|
|
184
|
+
metadata {
|
|
185
|
+
publishes 'payment.PaymentAuthorized'
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
marketplace.paymentService -> kafka.paymentEvents 'Publishes PaymentCaptured' {
|
|
189
|
+
metadata {
|
|
190
|
+
publishes 'payment.PaymentCaptured'
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
kafka.paymentEvents -> marketplace.orderService 'PaymentAuthorized advances the order' {
|
|
194
|
+
metadata {
|
|
195
|
+
consumes 'payment.PaymentAuthorized'
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
marketplace.orderService -> kafka.orderEvents 'Publishes OrderPlaced' {
|
|
199
|
+
metadata {
|
|
200
|
+
publishes 'order.OrderPlaced'
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
kafka.orderEvents -> marketplace.notificationService 'OrderPlaced triggers the confirmation' {
|
|
204
|
+
metadata {
|
|
205
|
+
consumes 'order.OrderPlaced'
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
kafka.paymentEvents -> marketplace.notificationService 'PaymentCaptured triggers the receipt' {
|
|
209
|
+
metadata {
|
|
210
|
+
consumes 'payment.PaymentCaptured'
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
// A producer OUTSIDE the fleet, expressed rather than left implicit. Without
|
|
214
|
+
// this edge notification-service's `consumes 'crm.CustomerUpdated'` would be
|
|
215
|
+
// `spine.message-unproduced` (error) — nobody in the fleet declares it is
|
|
216
|
+
// sent — and the exit ramp people take from that error is deleting the link.
|
|
217
|
+
// The edge moves the contract question to the one file that can settle it:
|
|
218
|
+
// the consumer's own asyncapi.yaml, which must define the payload
|
|
219
|
+
// (`spine.message-external` fires while it does not).
|
|
220
|
+
salesforce -> kafka.crmEvents 'Publishes CustomerUpdated' {
|
|
221
|
+
metadata {
|
|
222
|
+
publishes 'crm.CustomerUpdated'
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
kafka.crmEvents -> marketplace.notificationService 'CustomerUpdated refreshes contact details' {
|
|
226
|
+
metadata {
|
|
227
|
+
consumes 'crm.CustomerUpdated'
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// Views are LikeC4's renderer's, never loam's — nothing below is read by any
|
|
233
|
+
// check. Three of them rather than one `include *`, because at fleet scale a
|
|
234
|
+
// single view holding every call is both the slow one to compute and the one
|
|
235
|
+
// nobody can read: the synchronous map, the event spine and the platform
|
|
236
|
+
// dependencies answer different questions and belong on different pages.
|
|
237
|
+
views {
|
|
238
|
+
view landscape {
|
|
239
|
+
title 'Fleet — calls between our own services'
|
|
240
|
+
include *
|
|
241
|
+
exclude element.tag = #external
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
view events {
|
|
245
|
+
title 'Fleet — the event spine'
|
|
246
|
+
include kafka, kafka.*, * -> kafka.*, kafka.* -> *
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
view platform {
|
|
250
|
+
title 'Fleet — who depends on shared infrastructure'
|
|
251
|
+
include element.tag = #platform, * -> element.tag = #platform
|
|
252
|
+
}
|
|
253
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
---
|
|
2
|
+
service: order-service
|
|
3
|
+
status: draft
|
|
4
|
+
owner: orders-team
|
|
5
|
+
sources:
|
|
6
|
+
- src/main/kotlin/
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# order-service
|
|
10
|
+
|
|
11
|
+
Owns the order lifecycle — placement, the payment it orchestrates, and cancellation. This is
|
|
12
|
+
the **living spec**: the complete current state, not a changelog. Feature deltas
|
|
13
|
+
(`## ADDED|MODIFIED|REMOVED Requirements`) merge in here on `loam archive`, so what is written
|
|
14
|
+
below is always what the service promises today.
|
|
15
|
+
|
|
16
|
+
Three join lines carry the whole file into the rest of the docs, and each is graded:
|
|
17
|
+
`Operations:` names operationIds from `openapi.yaml` (an operation nobody names is
|
|
18
|
+
`api.ungoverned`; a name nothing defines is `spec-api.op-undefined`), `Publishes:` / `Consumes:`
|
|
19
|
+
name messages `asyncapi.yaml` declares an `action: send` / `action: receive` for
|
|
20
|
+
(`spec-event.message-undefined` otherwise), and `Requires:` names a pair
|
|
21
|
+
`architecture/permissions.yaml` declares (`permissions.unknown` otherwise). The architectural
|
|
22
|
+
obligations behind these promises — idempotency, the outbox, the dedupe ledger, the alerts —
|
|
23
|
+
are not here; they live in `arch.spec.md`, which is a separate requirement namespace.
|
|
24
|
+
|
|
25
|
+
## Requirements
|
|
26
|
+
|
|
27
|
+
### Requirement: Place an order
|
|
28
|
+
Requirement-ID: ORD-PLACE
|
|
29
|
+
The service SHALL accept an order for a customer's basket, obtain a payment authorization from
|
|
30
|
+
payment-service before acknowledging it, and announce the accepted order to the fleet. The
|
|
31
|
+
authorization answers in band — `authorizePayment` returns the reservation, so nothing is
|
|
32
|
+
acknowledged on a card nobody has reserved. The order is still placed in state
|
|
33
|
+
`awaiting_payment`: what clears that state is `payment.PaymentAuthorized`, and the requirement
|
|
34
|
+
that acts on it is ORD-ON-AUTHORIZED.
|
|
35
|
+
|
|
36
|
+
Operations: createOrder
|
|
37
|
+
Publishes: order.OrderPlaced
|
|
38
|
+
|
|
39
|
+
#### Scenario: A basket becomes an order
|
|
40
|
+
- **Given** a customer with a basket of two lines and a valid payment method
|
|
41
|
+
- **When** `createOrder` is called with a fresh `Idempotency-Key`
|
|
42
|
+
- **Then** the order is stored in state `awaiting_payment`
|
|
43
|
+
- **And** `order.OrderPlaced` is announced with the order id, the customer id and the total
|
|
44
|
+
|
|
45
|
+
#### Scenario: A reused idempotency key with a different basket is refused
|
|
46
|
+
- **Given** an order already placed under `Idempotency-Key` "ik-8842"
|
|
47
|
+
- **When** `createOrder` is called again with that key and a basket that differs from the first
|
|
48
|
+
- **Then** the service refuses with 409 and names the conflicting key
|
|
49
|
+
- **And** the first order is left exactly as it was placed
|
|
50
|
+
|
|
51
|
+
### Requirement: Read an order
|
|
52
|
+
Requirement-ID: ORD-READ
|
|
53
|
+
The service SHALL return an order's current state to its owner, so checkout-web's status page
|
|
54
|
+
reads the order rather than inferring it from payment events it cannot see.
|
|
55
|
+
|
|
56
|
+
Operations: getOrder
|
|
57
|
+
|
|
58
|
+
#### Scenario: An order is read back
|
|
59
|
+
- **Given** an order placed for customer "cus-31"
|
|
60
|
+
- **When** `getOrder` is called for that order id
|
|
61
|
+
- **Then** the response carries the order's state, its lines and its total
|
|
62
|
+
|
|
63
|
+
#### Scenario: An order id that was never issued
|
|
64
|
+
- **Given** an order id no placement ever produced
|
|
65
|
+
- **When** `getOrder` is called for it
|
|
66
|
+
- **Then** the service answers 404 rather than an empty order
|
|
67
|
+
|
|
68
|
+
### Requirement: Cancel an order
|
|
69
|
+
Requirement-ID: ORD-CANCEL
|
|
70
|
+
The service SHALL let an order be cancelled while nothing irreversible has happened to it, and
|
|
71
|
+
SHALL refuse once the order has been handed to fulfilment — a cancellation after that point is
|
|
72
|
+
a return, which this service does not model.
|
|
73
|
+
|
|
74
|
+
Operations: cancelOrder
|
|
75
|
+
Requires: user/orders:cancel
|
|
76
|
+
|
|
77
|
+
#### Scenario: A customer cancels before fulfilment
|
|
78
|
+
- **Given** an order in state `awaiting_payment`
|
|
79
|
+
- **When** its owner calls `cancelOrder`
|
|
80
|
+
- **Then** the order moves to `cancelled` and no further payment work is started
|
|
81
|
+
|
|
82
|
+
#### Scenario: An order already handed to fulfilment cannot be cancelled
|
|
83
|
+
- **Given** an order in state `fulfilling`
|
|
84
|
+
- **When** `cancelOrder` is called for it
|
|
85
|
+
- **Then** the service refuses with 409 and the order stays `fulfilling`
|
|
86
|
+
|
|
87
|
+
### Requirement: Accept an order through the v1 API
|
|
88
|
+
Requirement-ID: ORD-PLACE-V1
|
|
89
|
+
The service SHALL keep accepting orders on the v1 endpoint for as long as the partner batch
|
|
90
|
+
importer still calls it. This is legacy: v1 takes a flat basket with no idempotency key and no
|
|
91
|
+
currency, so a retried import creates a second order and every total is assumed to be EUR. It
|
|
92
|
+
is kept alive for one remaining caller and nothing new may be built on it — FEAT-112 retires
|
|
93
|
+
the endpoint once that importer has moved to `createOrder`.
|
|
94
|
+
|
|
95
|
+
Operations: createOrderV1
|
|
96
|
+
|
|
97
|
+
#### Scenario: The partner batch importer places an order on v1
|
|
98
|
+
- **Given** the partner importer, the only caller left on v1
|
|
99
|
+
- **When** it posts a flat basket to `createOrderV1`
|
|
100
|
+
- **Then** an order is placed exactly as `createOrder` places one, with the currency defaulted to EUR
|
|
101
|
+
- **And** no idempotency key is recorded, so a replayed import would place a second order
|
|
102
|
+
|
|
103
|
+
### Requirement: Advance an order when payment is authorized
|
|
104
|
+
Requirement-ID: ORD-ON-AUTHORIZED
|
|
105
|
+
The service SHALL move an order to `confirmed` when payment-service announces that the order's
|
|
106
|
+
payment was authorized, and SHALL leave an order that is no longer awaiting payment untouched.
|
|
107
|
+
The authorization decision belongs to payment-service; what this requirement owns is the order
|
|
108
|
+
state that follows from it.
|
|
109
|
+
|
|
110
|
+
Consumes: payment.PaymentAuthorized
|
|
111
|
+
|
|
112
|
+
#### Scenario: Authorization confirms the order
|
|
113
|
+
- **Given** an order in state `awaiting_payment`
|
|
114
|
+
- **When** `payment.PaymentAuthorized` arrives naming that order
|
|
115
|
+
- **Then** the order moves to `confirmed` and becomes eligible for fulfilment
|
|
116
|
+
|
|
117
|
+
#### Scenario: Authorization arrives for an order the customer already cancelled
|
|
118
|
+
- **Given** an order cancelled while its authorization was still in flight
|
|
119
|
+
- **When** `payment.PaymentAuthorized` arrives naming that order
|
|
120
|
+
- **Then** the order stays `cancelled` and is never confirmed
|
|
121
|
+
- **And** the authorization is left to expire uncaptured, because this service never captures
|