@ybotok/loam 0.1.0-beta.2 → 0.2.0-alpha.1
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 +2570 -61
- 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 +494 -0
- package/SCHEMA.md +2362 -245
- 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 +317 -0
- package/dist/commands/archive/plan/gate.js.map +1 -0
- package/dist/commands/archive/plan/landscape.js +161 -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 +251 -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 +82 -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 +194 -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 +236 -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 +250 -0
- package/dist/commands/validate/service/service.js.map +1 -0
- package/dist/commands/validate/service/specs.js +219 -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/agent/agents-stamp.js +155 -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 +334 -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/read.js +239 -0
- 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 +47 -0
- package/dist/core/brief/unchecked.js.map +1 -0
- package/dist/core/c4/arch.js +282 -0
- package/dist/core/c4/arch.js.map +1 -0
- package/dist/core/c4/likec4.js +88 -0
- package/dist/core/c4/likec4.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 +183 -0
- package/dist/core/c4/project/load.js.map +1 -0
- package/dist/core/c4/resolve/service.js +113 -0
- package/dist/core/c4/resolve/service.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 +126 -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 +172 -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 +251 -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/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 +59 -55
- 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 +132 -77
- 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 +118 -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 +192 -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 +236 -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 +171 -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 +187 -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 +235 -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 +55 -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 -291
- 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 -254
- package/dist/commands/status.js.map +0 -1
- package/dist/commands/unarchive.js.map +0 -1
- package/dist/commands/validate.js +0 -1591
- 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 -343
- package/dist/commands/vouch.js.map +0 -1
- package/dist/core/agent.js +0 -2065
- package/dist/core/agent.js.map +0 -1
- package/dist/core/agents-stamp.js +0 -68
- 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/brief.js +0 -733
- 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 -559
- 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 -479
- 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 -720
- package/dist/core/provenance.js.map +0 -1
- package/dist/core/records.js.map +0 -1
- package/dist/core/repo.js +0 -436
- package/dist/core/repo.js.map +0 -1
- package/dist/core/report.js.map +0 -1
- package/dist/core/spec.js +0 -481
- 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 -1104
- 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
|
@@ -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
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# API contract. Written by an agent from the `loam adopt` brief; forward-flow authors changes
|
|
2
|
+
# in the feature's own `specs/<svc>/openapi.yaml` delta and lets `loam archive` merge them here.
|
|
3
|
+
#
|
|
4
|
+
# Only the eight HTTP methods of a path item are read for operationIds — an id tucked inside a
|
|
5
|
+
# vendor extension does not exist as far as the spine is concerned, because a phantom id would
|
|
6
|
+
# mask a contract break. Two things are graded beyond form: every operation wants a response
|
|
7
|
+
# with a schema (`openapi.response-undescribed` otherwise — a contract that names an operation
|
|
8
|
+
# and says nothing about what it returns still sends the reader to the code), and every 4xx/5xx
|
|
9
|
+
# it declares wants a scenario that reaches it (`api.response-ungoverned`).
|
|
10
|
+
openapi: 3.1.0
|
|
11
|
+
info:
|
|
12
|
+
title: payment-service
|
|
13
|
+
version: "1.0"
|
|
14
|
+
paths:
|
|
15
|
+
/payments:
|
|
16
|
+
post:
|
|
17
|
+
operationId: authorizePayment
|
|
18
|
+
summary: Authorize a payment
|
|
19
|
+
requestBody:
|
|
20
|
+
required: true
|
|
21
|
+
content:
|
|
22
|
+
application/json:
|
|
23
|
+
schema:
|
|
24
|
+
$ref: '#/components/schemas/AuthorizationRequest'
|
|
25
|
+
responses:
|
|
26
|
+
"201":
|
|
27
|
+
description: Authorized
|
|
28
|
+
content:
|
|
29
|
+
application/json:
|
|
30
|
+
schema:
|
|
31
|
+
$ref: '#/components/schemas/Payment'
|
|
32
|
+
"409":
|
|
33
|
+
description: A different authorization already exists for this order
|
|
34
|
+
content:
|
|
35
|
+
application/json:
|
|
36
|
+
schema:
|
|
37
|
+
$ref: '#/components/schemas/Problem'
|
|
38
|
+
/payments/{id}/capture:
|
|
39
|
+
parameters:
|
|
40
|
+
- name: id
|
|
41
|
+
in: path
|
|
42
|
+
required: true
|
|
43
|
+
schema:
|
|
44
|
+
type: string
|
|
45
|
+
format: uuid
|
|
46
|
+
post:
|
|
47
|
+
operationId: capturePayment
|
|
48
|
+
summary: Capture an authorized payment
|
|
49
|
+
responses:
|
|
50
|
+
"200":
|
|
51
|
+
description: Captured
|
|
52
|
+
content:
|
|
53
|
+
application/json:
|
|
54
|
+
schema:
|
|
55
|
+
$ref: '#/components/schemas/Capture'
|
|
56
|
+
"404":
|
|
57
|
+
description: No such authorized payment
|
|
58
|
+
content:
|
|
59
|
+
application/json:
|
|
60
|
+
schema:
|
|
61
|
+
$ref: '#/components/schemas/Problem'
|
|
62
|
+
|
|
63
|
+
components:
|
|
64
|
+
schemas:
|
|
65
|
+
AuthorizationRequest:
|
|
66
|
+
type: object
|
|
67
|
+
required: [orderId, amount, currency]
|
|
68
|
+
properties:
|
|
69
|
+
orderId:
|
|
70
|
+
type: string
|
|
71
|
+
amount:
|
|
72
|
+
type: integer
|
|
73
|
+
description: minor units
|
|
74
|
+
currency:
|
|
75
|
+
type: string
|
|
76
|
+
pattern: '^[A-Z]{3}$'
|
|
77
|
+
Payment:
|
|
78
|
+
type: object
|
|
79
|
+
required: [paymentId, status]
|
|
80
|
+
properties:
|
|
81
|
+
paymentId:
|
|
82
|
+
type: string
|
|
83
|
+
format: uuid
|
|
84
|
+
status:
|
|
85
|
+
type: string
|
|
86
|
+
enum: [authorized, declined]
|
|
87
|
+
Capture:
|
|
88
|
+
type: object
|
|
89
|
+
required: [paymentId, capturedAmount]
|
|
90
|
+
properties:
|
|
91
|
+
paymentId:
|
|
92
|
+
type: string
|
|
93
|
+
format: uuid
|
|
94
|
+
capturedAmount:
|
|
95
|
+
type: integer
|
|
96
|
+
description: minor units
|
|
97
|
+
# RFC 9457. One shared shape for every refusal, so a client parses failures once —
|
|
98
|
+
# and so the 409 and 404 above declare a schema rather than a bare description.
|
|
99
|
+
Problem:
|
|
100
|
+
type: object
|
|
101
|
+
required: [type, title, status]
|
|
102
|
+
properties:
|
|
103
|
+
type:
|
|
104
|
+
type: string
|
|
105
|
+
format: uri
|
|
106
|
+
title:
|
|
107
|
+
type: string
|
|
108
|
+
status:
|
|
109
|
+
type: integer
|
|
110
|
+
detail:
|
|
111
|
+
type: string
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
---
|
|
2
|
+
service: payment-service
|
|
3
|
+
status: draft
|
|
4
|
+
owner: payments-team
|
|
5
|
+
sources:
|
|
6
|
+
- src/main/java/
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# payment-service
|
|
10
|
+
|
|
11
|
+
Owns payment authorization and capture. This is the **living spec** — the complete current
|
|
12
|
+
state. Feature deltas (ADDED/MODIFIED/REMOVED requirements) merge in here on `loam archive`;
|
|
13
|
+
`features/archive/` keeps every one of those deltas, so "which change introduced this
|
|
14
|
+
requirement" stays a search rather than a record somebody has to maintain.
|
|
15
|
+
|
|
16
|
+
## Requirements
|
|
17
|
+
|
|
18
|
+
### Requirement: Authorize a payment
|
|
19
|
+
Requirement-ID: PAY-AUTHORIZE
|
|
20
|
+
The service SHALL reserve funds for an order before capture, and SHALL treat an authorization
|
|
21
|
+
request as idempotent by order id so that a caller's timeout-and-retry never reserves twice.
|
|
22
|
+
|
|
23
|
+
Operations: authorizePayment
|
|
24
|
+
Publishes: payment.PaymentAuthorized
|
|
25
|
+
|
|
26
|
+
#### Scenario: Successful authorization
|
|
27
|
+
- **Given** an order with a valid payment method
|
|
28
|
+
- **When** authorization is requested
|
|
29
|
+
- **Then** funds are reserved and a `PaymentAuthorized` event is emitted
|
|
30
|
+
|
|
31
|
+
#### Scenario: A retry of the same authorization returns the first result
|
|
32
|
+
- **Given** an authorization already reserved for order "A-1"
|
|
33
|
+
- **When** the same request arrives again after a caller timeout
|
|
34
|
+
- **Then** the original authorization is returned and no second reservation is made
|
|
35
|
+
|
|
36
|
+
#### Scenario: A second authorization for the same order with a different amount is refused
|
|
37
|
+
- **Given** an authorization already reserved for order "A-1" of 100.00 USD
|
|
38
|
+
- **When** an authorization of 120.00 USD is requested for the same order
|
|
39
|
+
- **Then** the request is refused with 409 and the first reservation stands
|
|
40
|
+
|
|
41
|
+
### Requirement: Capture an authorized payment
|
|
42
|
+
Requirement-ID: PAY-CAPTURE
|
|
43
|
+
The service SHALL settle a previously authorized payment, and SHALL refuse to capture a payment
|
|
44
|
+
it never authorized.
|
|
45
|
+
|
|
46
|
+
Operations: capturePayment
|
|
47
|
+
Publishes: payment.PaymentCaptured
|
|
48
|
+
Requires: service/payments:capture
|
|
49
|
+
|
|
50
|
+
#### Scenario: Capture an authorized payment
|
|
51
|
+
- **Given** an authorized payment
|
|
52
|
+
- **When** capture is requested
|
|
53
|
+
- **Then** the payment is settled and a `PaymentCaptured` event is emitted
|
|
54
|
+
|
|
55
|
+
#### Scenario: Capturing an unknown payment is refused
|
|
56
|
+
- **Given** a payment id no authorization ever created
|
|
57
|
+
- **When** capture is requested for it
|
|
58
|
+
- **Then** the request is refused with 404 and nothing is settled
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 2,
|
|
3
|
+
"feature": "FEAT-088",
|
|
4
|
+
"dirName": "FEAT-088-refunds",
|
|
5
|
+
"archivedAt": "2026-08-18T08:01:34.290Z",
|
|
6
|
+
"files": [
|
|
7
|
+
{
|
|
8
|
+
"path": "services/order-service/spec.md",
|
|
9
|
+
"existed": true,
|
|
10
|
+
"after": "fcb80dc0121340860b3e9f26a65a5f4aa8966f3c57e1e89c22ea260a8b90c73f",
|
|
11
|
+
"before": "26db38f9c6ccfea240bc088f987343325a9b2e4b2d57df4b2aff212c27fee8c8"
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"path": "services/payment-service/spec.md",
|
|
15
|
+
"existed": true,
|
|
16
|
+
"after": "97b2b1b0f0bee2dcd7005dd792622f05cc701ff8f12ff5f21e7d9a2b36441b06",
|
|
17
|
+
"before": "a6248de65c69d3e42625cdd9be2d259e29840ab2377adb2e5669dab8ef9231cb"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"path": "services/payment-service/openapi.yaml",
|
|
21
|
+
"existed": true,
|
|
22
|
+
"after": "220bfd52275c43f996e5d88a7fd93bcd3d6587cb08832d80530d5bd5b05a8270",
|
|
23
|
+
"before": "e39f80d7755cd6f7b4b8223f08e9746a8d47a9416e6f14225e7ef7abe5caa3c8"
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"path": "architecture/landscape.likec4",
|
|
27
|
+
"existed": true,
|
|
28
|
+
"after": "f9931344156869c15ea3e17ce384f78a90403898a2c2a2b296641b8d4a8a0492",
|
|
29
|
+
"before": "701780cf4f72ec137e5b5e4e5d9eda741148948c484ca0ab9998828028ed2020"
|
|
30
|
+
}
|
|
31
|
+
]
|
|
32
|
+
}
|
package/examples/docs/features/archive/FEAT-088-refunds/adrs/0001-refunds-stay-in-payment-service.md
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: ADR-FEAT-088-0001
|
|
3
|
+
status: accepted
|
|
4
|
+
date: 2026-07-02
|
|
5
|
+
feature: FEAT-088
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# 1. Refunds belong to payment-service, not to order-service
|
|
9
|
+
|
|
10
|
+
## Context
|
|
11
|
+
Cancellation is an order concept and refunding is a money concept, and the cancellation flow
|
|
12
|
+
needs both. Putting the refund call in `order-service` is the shortest path; owning the refund
|
|
13
|
+
state there is the tempting next step.
|
|
14
|
+
|
|
15
|
+
## Decision
|
|
16
|
+
`order-service` calls `refundPayment` and owns nothing about it. The refund's state, its
|
|
17
|
+
idempotency and its reconciliation against the acquirer stay in `payment-service`, beside the
|
|
18
|
+
authorization and capture they are a continuation of.
|
|
19
|
+
|
|
20
|
+
## Consequences
|
|
21
|
+
- One service reconciles with the acquirer, so there is one answer to "what does the acquirer
|
|
22
|
+
think happened".
|
|
23
|
+
- `order-service` gains a synchronous dependency on `payment-service` for cancellation, which
|
|
24
|
+
its `health.yaml` already records as `critical`.
|
|
25
|
+
- A refund initiated anywhere else — support tooling, a future payouts service — goes through
|
|
26
|
+
the same operation rather than a second implementation.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// C4 DELTA for FEAT-088 — one new edge, tagged #FEAT-088.
|
|
2
|
+
//
|
|
3
|
+
// A delta is self-contained so it validates on its own, which is why the two existing systems
|
|
4
|
+
// and the group around them are quoted here. Only the tagged statement is merged; the quotes
|
|
5
|
+
// are how the tagged statement gets something to attach to.
|
|
6
|
+
specification {
|
|
7
|
+
element group
|
|
8
|
+
element softwareSystem
|
|
9
|
+
tag FEAT-088
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
model {
|
|
13
|
+
marketplace = group 'Marketplace' {
|
|
14
|
+
orderService = softwareSystem 'order-service'
|
|
15
|
+
paymentService = softwareSystem 'payment-service'
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
marketplace.orderService -> marketplace.paymentService 'Calls refundPayment' {
|
|
19
|
+
#FEAT-088
|
|
20
|
+
metadata { op 'refundPayment' }
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
views {
|
|
25
|
+
view feat_088 {
|
|
26
|
+
include *
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
---
|
|
2
|
+
feature: FEAT-088
|
|
3
|
+
title: Refund a captured payment
|
|
4
|
+
status: built
|
|
5
|
+
owner: payments-team
|
|
6
|
+
services: [payment-service, order-service]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# FEAT-088 — Refund a captured payment
|
|
10
|
+
|
|
11
|
+
## Why
|
|
12
|
+
Cancelling an order after capture leaves the customer's money with us. Support has been issuing
|
|
13
|
+
refunds by hand in the acquirer's dashboard, which means the fleet's own records say the payment
|
|
14
|
+
is still captured — the ledger and the truth disagree, and nothing in the docs said which one to
|
|
15
|
+
believe.
|
|
16
|
+
|
|
17
|
+
## Business acceptance
|
|
18
|
+
- A captured payment can be refunded in full.
|
|
19
|
+
- Cancelling an order whose payment was captured refunds it as part of the cancellation.
|
|
20
|
+
- A second refund of the same payment is refused rather than issued twice.
|
|
21
|
+
|
|
22
|
+
## Architectural summary
|
|
23
|
+
`payment-service` gains `refundPayment`; `order-service` calls it when it cancels an order that
|
|
24
|
+
was already captured. No new service and no new message: a refund is a state change of an
|
|
25
|
+
existing payment, and the event that reports it is deliberately left for the payout work that
|
|
26
|
+
needs it.
|