@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
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# The async contract — both directions, because this service is a producer and a
|
|
2
|
+
# consumer at once.
|
|
3
|
+
#
|
|
4
|
+
# AsyncAPI 3.0 only. Its operations are named top-level objects carrying
|
|
5
|
+
# `action: send|receive`, which is the exact analog of an `operationId` and the thing
|
|
6
|
+
# that makes direction legible; 2.x spells the same thing as publish/subscribe under
|
|
7
|
+
# a channel, where the two words are ambiguous about whose perspective they take. A
|
|
8
|
+
# 2.x document declares no `operations` at all, so loam would read it as a contract
|
|
9
|
+
# with no messages rather than as a mis-parsed one.
|
|
10
|
+
#
|
|
11
|
+
# The join is the message NAME, spelled three times and required to be identical: the
|
|
12
|
+
# landscape edge's `metadata { publishes }` / `metadata { consumes }`, a requirement's
|
|
13
|
+
# `Publishes:` / `Consumes:` line, and `name` below. A name this file does not declare
|
|
14
|
+
# an operation for, in the matching direction, is `spine.message-undefined` from the
|
|
15
|
+
# landscape and `spec-event.message-undefined` from the spec — the same breach seen
|
|
16
|
+
# from the two documents that can be wrong about it.
|
|
17
|
+
asyncapi: 3.0.0
|
|
18
|
+
info:
|
|
19
|
+
title: order-service events
|
|
20
|
+
version: "1.0"
|
|
21
|
+
|
|
22
|
+
channels:
|
|
23
|
+
orderEvents:
|
|
24
|
+
address: order.events.v1
|
|
25
|
+
description: Order lifecycle events, published by the outbox relay (ARCH-ORD-OUTBOX)
|
|
26
|
+
messages:
|
|
27
|
+
OrderPlaced:
|
|
28
|
+
$ref: '#/components/messages/OrderPlaced'
|
|
29
|
+
paymentEvents:
|
|
30
|
+
address: payment.events.v1
|
|
31
|
+
description: payment-service's channel, read by the payment-consumer
|
|
32
|
+
messages:
|
|
33
|
+
PaymentAuthorized:
|
|
34
|
+
$ref: '#/components/messages/PaymentAuthorized'
|
|
35
|
+
|
|
36
|
+
operations:
|
|
37
|
+
sendOrderPlaced:
|
|
38
|
+
action: send
|
|
39
|
+
channel:
|
|
40
|
+
$ref: '#/channels/orderEvents'
|
|
41
|
+
messages:
|
|
42
|
+
- $ref: '#/channels/orderEvents/messages/OrderPlaced'
|
|
43
|
+
# `action: receive` is what keeps order-service a consumer of this message and not a
|
|
44
|
+
# second producer of it: `asyncapi.message-contested` counts services declaring they
|
|
45
|
+
# SEND one name, and two of them make every consumer's join a coin flip. Declaring
|
|
46
|
+
# the message here is not a claim to own it — payment-service's contract is
|
|
47
|
+
# authoritative — it is what makes the consuming edge resolve at all.
|
|
48
|
+
receivePaymentAuthorized:
|
|
49
|
+
action: receive
|
|
50
|
+
channel:
|
|
51
|
+
$ref: '#/channels/paymentEvents'
|
|
52
|
+
messages:
|
|
53
|
+
- $ref: '#/channels/paymentEvents/messages/PaymentAuthorized'
|
|
54
|
+
|
|
55
|
+
components:
|
|
56
|
+
messages:
|
|
57
|
+
OrderPlaced:
|
|
58
|
+
# Namespaced by the domain that owns it, and produced by exactly one service.
|
|
59
|
+
name: order.OrderPlaced
|
|
60
|
+
title: Order placed
|
|
61
|
+
# The producer's copy, so this is the authoritative shape — notification-service
|
|
62
|
+
# declares a three-field subset of it and nothing compares the two, which is what
|
|
63
|
+
# leaves this file free to add a field without breaking a consumer. `currency`
|
|
64
|
+
# travels with `totalAmount` because a total with no currency is precisely the
|
|
65
|
+
# defect v1 shipped (ORD-PLACE-V1: every v1 total is assumed EUR). Declaring
|
|
66
|
+
# properties at all is what keeps this out of `asyncapi.payload-undescribed`.
|
|
67
|
+
payload:
|
|
68
|
+
type: object
|
|
69
|
+
required: [orderId, customerId, currency, totalAmount, placedAt]
|
|
70
|
+
properties:
|
|
71
|
+
orderId:
|
|
72
|
+
type: string
|
|
73
|
+
format: uuid
|
|
74
|
+
customerId:
|
|
75
|
+
type: string
|
|
76
|
+
format: uuid
|
|
77
|
+
currency:
|
|
78
|
+
type: string
|
|
79
|
+
pattern: '^[A-Z]{3}$'
|
|
80
|
+
totalAmount:
|
|
81
|
+
type: integer
|
|
82
|
+
description: minor units
|
|
83
|
+
placedAt:
|
|
84
|
+
type: string
|
|
85
|
+
format: date-time
|
|
86
|
+
|
|
87
|
+
PaymentAuthorized:
|
|
88
|
+
# The consumer's copy of a contract payment-service owns. It is deliberately the
|
|
89
|
+
# subset this service reads — `paymentId` is what ARCH-ORD-DEDUPE's ledger keys
|
|
90
|
+
# on and `orderId` is what ORD-ON-AUTHORIZED advances — and nothing compares the
|
|
91
|
+
# two documents field by field, because a consumer that demanded the producer's
|
|
92
|
+
# whole payload would break on every field the producer adds.
|
|
93
|
+
name: payment.PaymentAuthorized
|
|
94
|
+
title: Payment authorized
|
|
95
|
+
payload:
|
|
96
|
+
type: object
|
|
97
|
+
required: [paymentId, orderId, authorizedAt]
|
|
98
|
+
properties:
|
|
99
|
+
paymentId:
|
|
100
|
+
type: string
|
|
101
|
+
format: uuid
|
|
102
|
+
description: The ledger key that makes a redelivery a no-op.
|
|
103
|
+
orderId:
|
|
104
|
+
type: string
|
|
105
|
+
format: uuid
|
|
106
|
+
authorizedAt:
|
|
107
|
+
type: string
|
|
108
|
+
format: date-time
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Service health model. Objectives and queries are authored; the dependency graph is
|
|
2
|
+
# the C4 model's, restated here for the person who opens this file at 03:00.
|
|
3
|
+
#
|
|
4
|
+
# `loam validate` reads exactly three things out of it, and everything else — the
|
|
5
|
+
# queries, the thresholds, the check URLs, the criticality — is prose no check grades:
|
|
6
|
+
#
|
|
7
|
+
# - each `slis[].name` and `alerts[].name`, every one of which wants a requirement in
|
|
8
|
+
# arch.spec.md carrying `Covers: sli:<id>` / `Covers: alert:<id>`, or
|
|
9
|
+
# `health.uncovered` says the signal ships with nothing testing it;
|
|
10
|
+
# - each `dependencies[].service`, which must resolve in services/order-service/model.likec4
|
|
11
|
+
# by element id, `metadata { service }` binding or title, or
|
|
12
|
+
# `health.dependency-unmodelled` fires — the check that catches a dependency this
|
|
13
|
+
# file still swears by after the code stopped calling it;
|
|
14
|
+
# - the same dependency list is model-shape evidence: declared here and drawn nowhere
|
|
15
|
+
# is what makes `c4.no-relationships` a warning rather than a guess.
|
|
16
|
+
#
|
|
17
|
+
# A dependency a feature in flight introduces arrives with that feature. It is not a
|
|
18
|
+
# dependency of the living service yet, and writing it here early makes the on-call
|
|
19
|
+
# file describe a system nobody is running.
|
|
20
|
+
service: order-service
|
|
21
|
+
status: draft
|
|
22
|
+
slis:
|
|
23
|
+
- name: availability
|
|
24
|
+
query: "sum(rate(http_requests_total{job='order-service',code!~'5..'}[5m])) / sum(rate(http_requests_total{job='order-service'}[5m]))"
|
|
25
|
+
slo: 0.999
|
|
26
|
+
- name: order_placement_latency_p95_ms
|
|
27
|
+
# Scoped to POST /orders on purpose. getOrder is a single indexed read and
|
|
28
|
+
# /v1/orders is one nightly batch importer; averaged in, either would pull
|
|
29
|
+
# the p95 away from the number that says whether checkout feels broken.
|
|
30
|
+
query: "histogram_quantile(0.95, sum by (le) (rate(http_request_duration_seconds_bucket{job='order-service',path='/orders',method='POST'}[5m]))) * 1000"
|
|
31
|
+
slo: 800
|
|
32
|
+
alerts:
|
|
33
|
+
- name: order_placement_failures
|
|
34
|
+
# A ratio, not a bare rate. ARCH-ORD-SIGNALS' scenario and the runbook step
|
|
35
|
+
# below both say "more than 2% of placements", and `rate(5xx) > 0.02` says
|
|
36
|
+
# something else entirely — 0.02 failures per second, which is a different
|
|
37
|
+
# promise at every hour of the day and a silent one at 04:00. Nothing in
|
|
38
|
+
# loam grades this string: the arch requirement is the only thing that can
|
|
39
|
+
# catch it drifting from what it claims to measure.
|
|
40
|
+
expr: "sum(rate(http_requests_total{job='order-service',path='/orders',method='POST',code=~'5..'}[5m])) / sum(rate(http_requests_total{job='order-service',path='/orders',method='POST'}[5m])) > 0.02"
|
|
41
|
+
for: 5m
|
|
42
|
+
page: orders-oncall
|
|
43
|
+
runbook: runbook.md#placement-failures
|
|
44
|
+
checks:
|
|
45
|
+
liveness: GET /actuator/health/liveness
|
|
46
|
+
readiness: GET /actuator/health/readiness
|
|
47
|
+
# Critical runtime dependencies only, and the reconciliation with the model runs one
|
|
48
|
+
# way: everything named here must be modelled, not everything modelled named here.
|
|
49
|
+
# model.likec4 also draws the introspectToken call to identity-service, and it is
|
|
50
|
+
# absent below on purpose — introspection results are cached, so a brief identity
|
|
51
|
+
# outage degrades authorization rather than stopping placement, and a list that holds
|
|
52
|
+
# everything the service touches stops being a blast-radius list.
|
|
53
|
+
dependencies:
|
|
54
|
+
- service: kafka
|
|
55
|
+
criticality: critical # no broker -> no OrderPlaced, and the outbox grows unbounded
|
|
56
|
+
- service: payment-service
|
|
57
|
+
criticality: critical # no authorization -> no placement; ORD-PLACE cannot complete
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
// order-service's own C4 — the model behind `services/order-service/`.
|
|
2
|
+
//
|
|
3
|
+
// Every .likec4 file loam reads is parsed ON ITS OWN; nothing is concatenated and
|
|
4
|
+
// nothing is inherited from architecture/landscape.likec4. So this document declares
|
|
5
|
+
// the kinds it uses even though the landscape declares the same names: leaving them
|
|
6
|
+
// out does not borrow them, it fails to parse (`c4.invalid`, an error), and the arch
|
|
7
|
+
// axis, the `Covers:` resolution and health.yaml's dependency reconciliation all go
|
|
8
|
+
// quiet behind that one failure.
|
|
9
|
+
specification {
|
|
10
|
+
element softwareSystem
|
|
11
|
+
element container
|
|
12
|
+
element database
|
|
13
|
+
element topic
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
model {
|
|
17
|
+
orderService = softwareSystem 'order-service' {
|
|
18
|
+
description 'Owns the order lifecycle and orchestrates the payment behind it'
|
|
19
|
+
// The binding, not the title, is what ties this element to services/order-service/,
|
|
20
|
+
// and it is what every join downstream resolves through: health.yaml's dependency
|
|
21
|
+
// ids, an `arch.spec.md` edge entry written as `order-service -> payment-service`,
|
|
22
|
+
// the landscape's twin element. Rename the box without it and each of those stops
|
|
23
|
+
// matching in silence.
|
|
24
|
+
metadata {
|
|
25
|
+
service 'order-service'
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
api = container 'api' {
|
|
29
|
+
description 'REST API: createOrder, getOrder, cancelOrder, and the deprecated createOrderV1'
|
|
30
|
+
technology 'Spring Boot'
|
|
31
|
+
}
|
|
32
|
+
domain = container 'domain' {
|
|
33
|
+
description 'Order state machine; calls payment-service before an order is acknowledged'
|
|
34
|
+
technology 'Kotlin'
|
|
35
|
+
}
|
|
36
|
+
// The two background containers exist in this model because arch.spec.md has to
|
|
37
|
+
// be able to point at them: ARCH-ORD-OUTBOX and ARCH-ORD-DEDUPE cover them by id,
|
|
38
|
+
// and an obligation whose subject is not modelled is an obligation no `Covers:`
|
|
39
|
+
// line can name.
|
|
40
|
+
outbox = container 'outbox-relay' {
|
|
41
|
+
description 'Publishes committed outbox rows to order.events.v1 — at-least-once'
|
|
42
|
+
technology 'Kotlin'
|
|
43
|
+
}
|
|
44
|
+
consumer = container 'payment-consumer' {
|
|
45
|
+
description 'Applies payment.PaymentAuthorized once per paymentId, then advances the order'
|
|
46
|
+
technology 'Kotlin'
|
|
47
|
+
}
|
|
48
|
+
// The store is a NESTED container of this service, never a fleet-level peer: it
|
|
49
|
+
// has exactly one consumer, so drawn beside the services in the landscape it would
|
|
50
|
+
// read as a system in its own right (`landscape.datastore-private` is the check
|
|
51
|
+
// that pushes it back in here).
|
|
52
|
+
db = database 'db' {
|
|
53
|
+
description 'Orders, idempotency keys, the applied-payment ledger and the outbox table'
|
|
54
|
+
technology 'PostgreSQL'
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
api -> domain 'Places, reads and cancels'
|
|
58
|
+
domain -> db 'Writes the order, its idempotency key and its outbox row in one transaction'
|
|
59
|
+
outbox -> db 'Polls unpublished outbox rows and marks them sent'
|
|
60
|
+
consumer -> db 'Records the applied paymentId, then advances the order'
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Everything the service touches from outside its own boundary. The landscape
|
|
64
|
+
// carries only the boundary crossing; THIS file carries the whole reach, and it is
|
|
65
|
+
// the file `health.yaml`'s `dependencies:` are reconciled against — an id nothing
|
|
66
|
+
// here answers to is `health.dependency-unmodelled`, the check that catches a
|
|
67
|
+
// dependency the on-call file still swears by after the code stopped calling it.
|
|
68
|
+
paymentService = softwareSystem 'payment-service' {
|
|
69
|
+
description 'Authorizes and captures cards'
|
|
70
|
+
metadata {
|
|
71
|
+
service 'payment-service'
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
identityService = softwareSystem 'identity-service' {
|
|
75
|
+
description 'Issues and introspects access tokens'
|
|
76
|
+
metadata {
|
|
77
|
+
service 'identity-service'
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
kafka = softwareSystem 'kafka' {
|
|
81
|
+
description 'Event backbone (platform)'
|
|
82
|
+
// A topic per channel rather than one broker box. What a producer and a consumer
|
|
83
|
+
// actually share is the channel, and pointing every edge at the broker turns the
|
|
84
|
+
// fleet map into a star with one node in the middle the moment the fleet is
|
|
85
|
+
// bigger than this example.
|
|
86
|
+
orderEvents = topic 'order.events'
|
|
87
|
+
paymentEvents = topic 'payment.events'
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// The edges, drawn from the container that really makes each call — which is the
|
|
91
|
+
// half of the truth the landscape cannot hold. A model with elements and no
|
|
92
|
+
// relationships beside a health.yaml declaring two dependencies is
|
|
93
|
+
// `c4.no-relationships`: a service that reaches nothing is almost never true.
|
|
94
|
+
//
|
|
95
|
+
// The `metadata` blocks below are not read for a service model — only landscape
|
|
96
|
+
// edges feed `spine.op-*` and the event spine — but they are written anyway so the
|
|
97
|
+
// two documents cannot drift into disagreeing about which operation and which
|
|
98
|
+
// message each edge stands for.
|
|
99
|
+
orderService.domain -> paymentService 'Calls authorizePayment' {
|
|
100
|
+
metadata {
|
|
101
|
+
op 'authorizePayment'
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// ORD-CANCEL's `Requires: user/orders:cancel` has to be enforced somewhere, and this
|
|
105
|
+
// is that edge: the API introspects the caller's token before it will cancel anything.
|
|
106
|
+
// Drawn here and absent from health.yaml, which states the asymmetry and the reason.
|
|
107
|
+
orderService.api -> identityService 'Calls introspectToken' {
|
|
108
|
+
metadata {
|
|
109
|
+
op 'introspectToken'
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
orderService.outbox -> kafka.orderEvents 'Publishes OrderPlaced' {
|
|
113
|
+
metadata {
|
|
114
|
+
publishes 'order.OrderPlaced'
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// Drawn topic → consumer, the direction the landscape uses and the one the
|
|
118
|
+
// event spine requires there: `consumes` binds the edge's TARGET, so the same
|
|
119
|
+
// edge drawn the other way round binds to nothing. Nothing grades it in a
|
|
120
|
+
// service model, which is exactly why it follows the same convention — a
|
|
121
|
+
// reader who learns the arrow here should not have to unlearn it upstairs.
|
|
122
|
+
kafka.paymentEvents -> orderService.consumer 'PaymentAuthorized advances the order' {
|
|
123
|
+
metadata {
|
|
124
|
+
consumes 'payment.PaymentAuthorized'
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Views are the LikeC4 renderer's, never loam's — no check reads this block. Scoped
|
|
130
|
+
// to the system, because "what does an order stand on" is this file's question and
|
|
131
|
+
// the fleet-wide one is already answered in architecture/landscape.likec4.
|
|
132
|
+
views {
|
|
133
|
+
view order_service of orderService {
|
|
134
|
+
title 'order-service — containers, its store, and what it reaches'
|
|
135
|
+
include *
|
|
136
|
+
include paymentService, identityService, kafka, kafka.*
|
|
137
|
+
}
|
|
138
|
+
}
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
# The HTTP contract. Written by an agent from the `loam adopt` brief, then curated;
|
|
2
|
+
# forward-flow changes are authored in a feature's specs/order-service/openapi.yaml
|
|
3
|
+
# and merged here by `loam archive`.
|
|
4
|
+
#
|
|
5
|
+
# `operationId` is the token the whole spine joins on: a landscape edge names it in
|
|
6
|
+
# `metadata { op }`, a requirement names it on an `Operations:` line, and it is
|
|
7
|
+
# defined here. loam reads only the eight HTTP methods of a path item, so an id
|
|
8
|
+
# tucked into a vendor extension does not exist — a phantom id would mask a contract
|
|
9
|
+
# break rather than declare an operation.
|
|
10
|
+
openapi: 3.1.0
|
|
11
|
+
info:
|
|
12
|
+
title: order-service
|
|
13
|
+
version: "2.0"
|
|
14
|
+
description: Order placement, retrieval and cancellation for the marketplace checkout.
|
|
15
|
+
|
|
16
|
+
paths:
|
|
17
|
+
/orders:
|
|
18
|
+
post:
|
|
19
|
+
operationId: createOrder
|
|
20
|
+
summary: Place an order
|
|
21
|
+
# The idempotency key is part of the contract, not an implementation detail:
|
|
22
|
+
# ARCH-ORD-IDEMPOTENCY promises a replay of this header returns the first
|
|
23
|
+
# order, and a promise a caller cannot see is a promise nobody can rely on.
|
|
24
|
+
parameters:
|
|
25
|
+
- name: Idempotency-Key
|
|
26
|
+
in: header
|
|
27
|
+
required: true
|
|
28
|
+
description: Caller-generated key; a repeat replays the first response.
|
|
29
|
+
schema:
|
|
30
|
+
type: string
|
|
31
|
+
maxLength: 64
|
|
32
|
+
requestBody:
|
|
33
|
+
required: true
|
|
34
|
+
content:
|
|
35
|
+
application/json:
|
|
36
|
+
schema:
|
|
37
|
+
$ref: '#/components/schemas/CreateOrderRequest'
|
|
38
|
+
# Every operation needs at least one response declaring a schema, or
|
|
39
|
+
# `openapi.response-undescribed` says the contract names the operation and
|
|
40
|
+
# nothing about what it returns. And every exact 4xx/5xx below has to be
|
|
41
|
+
# reachable from a scenario of a requirement whose `Operations:` names this
|
|
42
|
+
# operation — 409 is written as a scenario in spec.md's ORD-PLACE, not as a
|
|
43
|
+
# sentence about refusals, or `api.response-ungoverned` fires.
|
|
44
|
+
responses:
|
|
45
|
+
"201":
|
|
46
|
+
description: The order was accepted and is awaiting payment.
|
|
47
|
+
content:
|
|
48
|
+
application/json:
|
|
49
|
+
schema:
|
|
50
|
+
$ref: '#/components/schemas/Order'
|
|
51
|
+
"409":
|
|
52
|
+
description: The idempotency key was already used for a different basket.
|
|
53
|
+
content:
|
|
54
|
+
application/json:
|
|
55
|
+
schema:
|
|
56
|
+
$ref: '#/components/schemas/Problem'
|
|
57
|
+
|
|
58
|
+
/orders/{id}:
|
|
59
|
+
get:
|
|
60
|
+
operationId: getOrder
|
|
61
|
+
summary: Read an order
|
|
62
|
+
parameters:
|
|
63
|
+
- name: id
|
|
64
|
+
in: path
|
|
65
|
+
required: true
|
|
66
|
+
schema:
|
|
67
|
+
type: string
|
|
68
|
+
format: uuid
|
|
69
|
+
responses:
|
|
70
|
+
"200":
|
|
71
|
+
description: The order as it currently stands.
|
|
72
|
+
content:
|
|
73
|
+
application/json:
|
|
74
|
+
schema:
|
|
75
|
+
$ref: '#/components/schemas/Order'
|
|
76
|
+
"404":
|
|
77
|
+
description: No order with that id was ever placed.
|
|
78
|
+
content:
|
|
79
|
+
application/json:
|
|
80
|
+
schema:
|
|
81
|
+
$ref: '#/components/schemas/Problem'
|
|
82
|
+
|
|
83
|
+
/orders/{id}/cancel:
|
|
84
|
+
post:
|
|
85
|
+
operationId: cancelOrder
|
|
86
|
+
summary: Cancel an order
|
|
87
|
+
parameters:
|
|
88
|
+
- name: id
|
|
89
|
+
in: path
|
|
90
|
+
required: true
|
|
91
|
+
schema:
|
|
92
|
+
type: string
|
|
93
|
+
format: uuid
|
|
94
|
+
responses:
|
|
95
|
+
"200":
|
|
96
|
+
description: The order is cancelled.
|
|
97
|
+
content:
|
|
98
|
+
application/json:
|
|
99
|
+
schema:
|
|
100
|
+
$ref: '#/components/schemas/Order'
|
|
101
|
+
"409":
|
|
102
|
+
description: The order has already been handed to fulfilment.
|
|
103
|
+
content:
|
|
104
|
+
application/json:
|
|
105
|
+
schema:
|
|
106
|
+
$ref: '#/components/schemas/Problem'
|
|
107
|
+
|
|
108
|
+
/v1/orders:
|
|
109
|
+
post:
|
|
110
|
+
operationId: createOrderV1
|
|
111
|
+
summary: Place an order (v1, legacy)
|
|
112
|
+
description: >-
|
|
113
|
+
Superseded by createOrder. Takes a flat basket, assumes EUR and accepts no
|
|
114
|
+
idempotency key, so a replayed import places a second order. One caller left:
|
|
115
|
+
the partner batch importer.
|
|
116
|
+
# This one flag is the whole lifecycle signal on the spine. loam reads the
|
|
117
|
+
# standard per-operation `deprecated` and turns it into two warnings: every
|
|
118
|
+
# landscape edge whose `metadata { op }` names this operation gets
|
|
119
|
+
# `spine.op-deprecated` (the contract holds — the CONSUMER should be migrating,
|
|
120
|
+
# counted per inbound edge), and the requirement that governs only deprecated
|
|
121
|
+
# operations gets `api.requirement-deprecated` once — ORD-PLACE-V1 in spec.md,
|
|
122
|
+
# which is the demonstration this example ships. Deprecation is the first step
|
|
123
|
+
# of a removal; the last one is FEAT-112, which retires this path and method
|
|
124
|
+
# with an `x-loam-remove: true` marker in its own openapi delta plus a REMOVED
|
|
125
|
+
# requirement naming createOrderV1. Until that feature archives the operation is
|
|
126
|
+
# live, and deleting it here would break the importer today.
|
|
127
|
+
deprecated: true
|
|
128
|
+
requestBody:
|
|
129
|
+
required: true
|
|
130
|
+
content:
|
|
131
|
+
application/json:
|
|
132
|
+
schema:
|
|
133
|
+
$ref: '#/components/schemas/CreateOrderV1Request'
|
|
134
|
+
responses:
|
|
135
|
+
"201":
|
|
136
|
+
description: The order was accepted.
|
|
137
|
+
content:
|
|
138
|
+
application/json:
|
|
139
|
+
schema:
|
|
140
|
+
$ref: '#/components/schemas/OrderV1'
|
|
141
|
+
|
|
142
|
+
# Every schema lives in this document. An external `$ref` is out of scope for the
|
|
143
|
+
# reader and for the merge alike, and an internal one that resolves to nothing is
|
|
144
|
+
# `openapi.ref-unresolved` — the operation validates while its payload is silently
|
|
145
|
+
# absent, which is exactly the shape that reads as a complete contract and is not one.
|
|
146
|
+
components:
|
|
147
|
+
schemas:
|
|
148
|
+
CreateOrderRequest:
|
|
149
|
+
type: object
|
|
150
|
+
required: [customerId, currency, lines]
|
|
151
|
+
properties:
|
|
152
|
+
customerId:
|
|
153
|
+
type: string
|
|
154
|
+
format: uuid
|
|
155
|
+
currency:
|
|
156
|
+
type: string
|
|
157
|
+
pattern: '^[A-Z]{3}$'
|
|
158
|
+
lines:
|
|
159
|
+
type: array
|
|
160
|
+
minItems: 1
|
|
161
|
+
items:
|
|
162
|
+
$ref: '#/components/schemas/OrderLine'
|
|
163
|
+
|
|
164
|
+
CreateOrderV1Request:
|
|
165
|
+
type: object
|
|
166
|
+
description: The v1 shape — no currency, no idempotency key.
|
|
167
|
+
required: [customer, items]
|
|
168
|
+
properties:
|
|
169
|
+
customer:
|
|
170
|
+
type: string
|
|
171
|
+
items:
|
|
172
|
+
type: array
|
|
173
|
+
minItems: 1
|
|
174
|
+
items:
|
|
175
|
+
type: object
|
|
176
|
+
required: [sku, qty, unitPrice]
|
|
177
|
+
properties:
|
|
178
|
+
sku:
|
|
179
|
+
type: string
|
|
180
|
+
qty:
|
|
181
|
+
type: integer
|
|
182
|
+
minimum: 1
|
|
183
|
+
unitPrice:
|
|
184
|
+
type: integer
|
|
185
|
+
description: minor units, assumed EUR
|
|
186
|
+
|
|
187
|
+
OrderLine:
|
|
188
|
+
type: object
|
|
189
|
+
required: [sku, quantity, unitAmount]
|
|
190
|
+
properties:
|
|
191
|
+
sku:
|
|
192
|
+
type: string
|
|
193
|
+
quantity:
|
|
194
|
+
type: integer
|
|
195
|
+
minimum: 1
|
|
196
|
+
unitAmount:
|
|
197
|
+
type: integer
|
|
198
|
+
description: minor units
|
|
199
|
+
|
|
200
|
+
Order:
|
|
201
|
+
type: object
|
|
202
|
+
required: [orderId, customerId, state, currency, totalAmount, lines]
|
|
203
|
+
properties:
|
|
204
|
+
orderId:
|
|
205
|
+
type: string
|
|
206
|
+
format: uuid
|
|
207
|
+
customerId:
|
|
208
|
+
type: string
|
|
209
|
+
format: uuid
|
|
210
|
+
state:
|
|
211
|
+
type: string
|
|
212
|
+
description: The lifecycle state ORD-PLACE, ORD-CANCEL and ORD-ON-AUTHORIZED move between.
|
|
213
|
+
enum: [awaiting_payment, confirmed, fulfilling, cancelled]
|
|
214
|
+
currency:
|
|
215
|
+
type: string
|
|
216
|
+
pattern: '^[A-Z]{3}$'
|
|
217
|
+
totalAmount:
|
|
218
|
+
type: integer
|
|
219
|
+
description: minor units
|
|
220
|
+
lines:
|
|
221
|
+
type: array
|
|
222
|
+
items:
|
|
223
|
+
$ref: '#/components/schemas/OrderLine'
|
|
224
|
+
placedAt:
|
|
225
|
+
type: string
|
|
226
|
+
format: date-time
|
|
227
|
+
|
|
228
|
+
OrderV1:
|
|
229
|
+
type: object
|
|
230
|
+
description: The v1 response — a flatter Order, kept for the one remaining caller.
|
|
231
|
+
required: [id, status, total]
|
|
232
|
+
properties:
|
|
233
|
+
id:
|
|
234
|
+
type: string
|
|
235
|
+
status:
|
|
236
|
+
type: string
|
|
237
|
+
total:
|
|
238
|
+
type: integer
|
|
239
|
+
description: minor units, EUR
|
|
240
|
+
|
|
241
|
+
Problem:
|
|
242
|
+
type: object
|
|
243
|
+
description: RFC 9457 problem details, the one refusal shape every 4xx here uses.
|
|
244
|
+
required: [type, title, status]
|
|
245
|
+
properties:
|
|
246
|
+
type:
|
|
247
|
+
type: string
|
|
248
|
+
format: uri
|
|
249
|
+
title:
|
|
250
|
+
type: string
|
|
251
|
+
status:
|
|
252
|
+
type: integer
|
|
253
|
+
detail:
|
|
254
|
+
type: string
|
|
255
|
+
idempotencyKey:
|
|
256
|
+
type: string
|
|
257
|
+
description: Present on the createOrder 409, naming the key that conflicted.
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
---
|
|
2
|
+
service: order-service
|
|
3
|
+
status: draft
|
|
4
|
+
owner: orders-team
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# order-service — runbook
|
|
8
|
+
|
|
9
|
+
Nothing in this file is read by a check: `loam list` tracks that a runbook exists and stops
|
|
10
|
+
there. It is here because the two incidents below are the ones the architecture in
|
|
11
|
+
`arch.spec.md` makes possible, and the person paged at 03:00 needs the consequence spelled out,
|
|
12
|
+
not the requirement id.
|
|
13
|
+
|
|
14
|
+
## Deploy
|
|
15
|
+
- Pipeline: `.gitlab-ci.yml` -> `deploy:prod` (manual gate). Rolling, one pod at a time.
|
|
16
|
+
- Config: `application.yml`; secrets via Vault path `secret/order-service`.
|
|
17
|
+
- The outbox relay and the payment-consumer ship in the same image as the API and are switched
|
|
18
|
+
on per deployment (`ORDER_RELAY_ENABLED`, `ORDER_CONSUMER_ENABLED`). Scaling the API to zero
|
|
19
|
+
therefore stops publishing and consuming too — check both flags before assuming a broker
|
|
20
|
+
fault.
|
|
21
|
+
|
|
22
|
+
## Health
|
|
23
|
+
- Liveness: `GET /actuator/health/liveness`
|
|
24
|
+
- Readiness: `GET /actuator/health/readiness` — checks the database and the kafka connection.
|
|
25
|
+
It deliberately does NOT check payment-service: a payment-service outage must show up as
|
|
26
|
+
failed placements and a page, not as every order-service pod dropping out of the load
|
|
27
|
+
balancer at once.
|
|
28
|
+
|
|
29
|
+
## Common incidents
|
|
30
|
+
|
|
31
|
+
### Placement failures {#placement-failures}
|
|
32
|
+
`order_placement_failures` is paging, so more than 2% of `POST /orders` is returning 5xx.
|
|
33
|
+
|
|
34
|
+
1. Look at `authorizePayment` from this side first — the usual cause is payment-service, and
|
|
35
|
+
`order_placement_latency_p95_ms` rising before the error rate is the signature.
|
|
36
|
+
2. If payment-service is healthy, check the database connection pool: placement writes the
|
|
37
|
+
order, its idempotency key and its outbox row in one transaction, so pool exhaustion fails
|
|
38
|
+
the whole placement rather than degrading it.
|
|
39
|
+
3. Do NOT drain the queue of retries by hand. Every accepted placement carries an
|
|
40
|
+
`Idempotency-Key`; callers retrying is the designed path and a replay returns the first
|
|
41
|
+
order.
|
|
42
|
+
|
|
43
|
+
### Outbox backlog
|
|
44
|
+
`OrderPlaced` events stop arriving while orders keep being placed — notification-service goes
|
|
45
|
+
quiet and nothing else looks wrong, because placements are still committing.
|
|
46
|
+
|
|
47
|
+
1. Check the `order_outbox_pending` gauge and the relay's lag against `order.events.v1`.
|
|
48
|
+
2. If kafka is unreachable, there is nothing to fix here: the relay retries and the backlog
|
|
49
|
+
drains on its own once the broker returns. Orders are safe — that is the whole point of
|
|
50
|
+
writing the event in the placement transaction.
|
|
51
|
+
3. If kafka is healthy and the relay is stuck, restart it. Republishing is safe: the relay
|
|
52
|
+
promises at-least-once, consumers deduplicate, and a row published twice is a scenario
|
|
53
|
+
ARCH-ORD-OUTBOX already covers.
|
|
54
|
+
4. Never delete outbox rows to clear a backlog. A deleted row is an order the fleet was never
|
|
55
|
+
told about, and nothing downstream will ever notice.
|
|
56
|
+
|
|
57
|
+
## Escalation
|
|
58
|
+
- On-call channel: `#orders-oncall`; paging rotation `orders-oncall`.
|
|
59
|
+
- Payment authorization problems escalate to `#payments-oncall` — order-service orchestrates
|
|
60
|
+
the payment (`adrs/0001-orchestrated-order-lifecycle.md`) but owns none of it.
|
|
61
|
+
- Broker problems escalate to the platform team; kafka is `#external #platform` in the
|
|
62
|
+
landscape and nobody in this fleet operates it.
|