@ybotok/loam 0.1.0-beta.3 → 0.2.0-alpha.13
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 +5992 -82
- package/COMPARISON.md +168 -63
- package/CONTRIBUTING.md +121 -0
- package/MIGRATING-from-OpenSpec.md +238 -55
- package/QUICKSTART.md +302 -0
- package/README.md +653 -144
- package/ROADMAP.md +1035 -0
- package/SCHEMA.md +3916 -263
- package/SECURITY.md +21 -3
- package/WORKFLOW.md +927 -0
- package/dist/cli.js +133 -21
- package/dist/cli.js.map +1 -1
- package/dist/commands/adopt/adopt.js +204 -0
- package/dist/commands/adopt/adopt.js.map +1 -0
- package/dist/commands/adopt/render.js +309 -0
- package/dist/commands/adopt/render.js.map +1 -0
- package/dist/commands/archive/archive.js +74 -0
- package/dist/commands/archive/archive.js.map +1 -0
- package/dist/commands/archive/closing.js +42 -0
- package/dist/commands/archive/closing.js.map +1 -0
- package/dist/commands/archive/plan/contracts/asyncapi.js +172 -0
- package/dist/commands/archive/plan/contracts/asyncapi.js.map +1 -0
- package/dist/commands/archive/plan/contracts/consumers.js +56 -0
- package/dist/commands/archive/plan/contracts/consumers.js.map +1 -0
- package/dist/commands/archive/plan/contracts/openapi.js +193 -0
- package/dist/commands/archive/plan/contracts/openapi.js.map +1 -0
- package/dist/commands/archive/plan/contracts/verdict-lines.js +103 -0
- package/dist/commands/archive/plan/contracts/verdict-lines.js.map +1 -0
- package/dist/commands/archive/plan/document/head.js +151 -0
- package/dist/commands/archive/plan/document/head.js.map +1 -0
- package/dist/commands/archive/plan/document/links.js +284 -0
- package/dist/commands/archive/plan/document/links.js.map +1 -0
- package/dist/commands/archive/plan/document/run.js +136 -0
- package/dist/commands/archive/plan/document/run.js.map +1 -0
- package/dist/commands/archive/plan/gate.js +319 -0
- package/dist/commands/archive/plan/gate.js.map +1 -0
- package/dist/commands/archive/plan/landscape.js +298 -0
- package/dist/commands/archive/plan/landscape.js.map +1 -0
- package/dist/commands/archive/plan/model/extending.js +85 -0
- package/dist/commands/archive/plan/model/extending.js.map +1 -0
- package/dist/commands/archive/plan/refusal.js +106 -0
- package/dist/commands/archive/plan/refusal.js.map +1 -0
- package/dist/commands/archive/plan/specs.js +318 -0
- package/dist/commands/archive/plan/specs.js.map +1 -0
- package/dist/commands/archive/plan/state.js +30 -0
- package/dist/commands/archive/plan/state.js.map +1 -0
- package/dist/commands/archive/run.js +355 -0
- package/dist/commands/archive/run.js.map +1 -0
- package/dist/commands/archive/shipped.js +49 -0
- package/dist/commands/archive/shipped.js.map +1 -0
- package/dist/commands/context/context.js +166 -0
- package/dist/commands/context/context.js.map +1 -0
- package/dist/commands/context/print.js +305 -0
- package/dist/commands/context/print.js.map +1 -0
- package/dist/commands/delta/delta.js +367 -0
- package/dist/commands/delta/delta.js.map +1 -0
- package/dist/commands/delta/print.js +221 -0
- package/dist/commands/delta/print.js.map +1 -0
- package/dist/commands/dependencies.js +6 -8
- package/dist/commands/dependencies.js.map +1 -1
- package/dist/commands/diff/diff.js +86 -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 +65 -5
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/explain/explain.js +227 -0
- package/dist/commands/explain/explain.js.map +1 -0
- package/dist/commands/explore.js +39 -28
- package/dist/commands/explore.js.map +1 -1
- package/dist/commands/gate/gate.js +152 -0
- package/dist/commands/gate/gate.js.map +1 -0
- package/dist/commands/gate/print.js +66 -0
- package/dist/commands/gate/print.js.map +1 -0
- package/dist/commands/gherkin/commit.js +105 -0
- package/dist/commands/gherkin/commit.js.map +1 -0
- package/dist/commands/gherkin/gherkin.js +262 -0
- package/dist/commands/gherkin/gherkin.js.map +1 -0
- package/dist/commands/gherkin/reconcile.js +146 -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 +72 -0
- package/dist/commands/init/first-hour.js.map +1 -0
- package/dist/commands/{init.js → init/init.js} +142 -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 +63 -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 +155 -0
- package/dist/commands/list/json.js.map +1 -0
- package/dist/commands/list/list.js +358 -0
- package/dist/commands/list/list.js.map +1 -0
- package/dist/commands/list/print.js +344 -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/suites/suites.js +140 -0
- package/dist/commands/list/suites/suites.js.map +1 -0
- package/dist/commands/list/views.js +108 -0
- package/dist/commands/list/views.js.map +1 -0
- package/dist/commands/mcp/dispatch.js +238 -0
- package/dist/commands/mcp/dispatch.js.map +1 -0
- package/dist/commands/mcp/mcp.js +75 -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 +175 -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 +143 -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 +86 -0
- package/dist/commands/migrate-openspec/openspec/decisions.js.map +1 -0
- package/dist/commands/migrate-openspec/openspec/error.js +18 -0
- package/dist/commands/migrate-openspec/openspec/error.js.map +1 -0
- package/dist/commands/migrate-openspec/openspec/mapping.js +162 -0
- package/dist/commands/migrate-openspec/openspec/mapping.js.map +1 -0
- package/dist/commands/migrate-openspec/openspec/paths.js +40 -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/capability-template.js +118 -0
- package/dist/commands/new/capability-template.js.map +1 -0
- package/dist/commands/new/commit.js +62 -0
- package/dist/commands/new/commit.js.map +1 -0
- package/dist/commands/new/modifies.js +206 -0
- package/dist/commands/new/modifies.js.map +1 -0
- package/dist/commands/new/new.js +328 -0
- package/dist/commands/new/new.js.map +1 -0
- package/dist/commands/new/templates.js +279 -0
- package/dist/commands/new/templates.js.map +1 -0
- package/dist/commands/open.js +199 -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} +38 -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 +300 -0
- package/dist/commands/rebase/rebase.js.map +1 -0
- package/dist/commands/seed/commit.js +221 -0
- package/dist/commands/seed/commit.js.map +1 -0
- package/dist/commands/seed/plan.js +278 -0
- package/dist/commands/seed/plan.js.map +1 -0
- package/dist/commands/seed/seed.js +174 -0
- package/dist/commands/seed/seed.js.map +1 -0
- package/dist/commands/show/feature.js +182 -0
- package/dist/commands/show/feature.js.map +1 -0
- package/dist/commands/show/introduced.js +157 -0
- package/dist/commands/show/introduced.js.map +1 -0
- package/dist/commands/show/marks.js +53 -0
- package/dist/commands/show/marks.js.map +1 -0
- package/dist/commands/show/service.js +239 -0
- package/dist/commands/show/service.js.map +1 -0
- package/dist/commands/show/show.js +87 -0
- package/dist/commands/show/show.js.map +1 -0
- package/dist/commands/status/fleet-next.js +90 -0
- package/dist/commands/status/fleet-next.js.map +1 -0
- package/dist/commands/status/json.js +47 -0
- package/dist/commands/status/json.js.map +1 -0
- package/dist/commands/status/print.js +209 -0
- package/dist/commands/status/print.js.map +1 -0
- package/dist/commands/status/status.js +115 -0
- package/dist/commands/status/status.js.map +1 -0
- package/dist/commands/steps/steps.js +269 -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 +325 -0
- package/dist/commands/subsystem/move.js.map +1 -0
- package/dist/commands/subsystem/query.js +113 -0
- package/dist/commands/subsystem/query.js.map +1 -0
- package/dist/commands/subsystem/subsystem.js +98 -0
- package/dist/commands/subsystem/subsystem.js.map +1 -0
- package/dist/commands/subsystem/sync.js +318 -0
- package/dist/commands/subsystem/sync.js.map +1 -0
- package/dist/commands/subsystem/txn/exclude.js +132 -0
- package/dist/commands/subsystem/txn/exclude.js.map +1 -0
- package/dist/commands/subsystem/txn/links.js +128 -0
- package/dist/commands/subsystem/txn/links.js.map +1 -0
- package/dist/commands/subsystem/txn/report.js +174 -0
- package/dist/commands/subsystem/txn/report.js.map +1 -0
- package/dist/commands/subsystem/txn/txn.js +196 -0
- package/dist/commands/subsystem/txn/txn.js.map +1 -0
- package/dist/commands/subsystem/txn/views.js +249 -0
- package/dist/commands/subsystem/txn/views.js.map +1 -0
- package/dist/commands/tasks/actions.js +107 -0
- package/dist/commands/tasks/actions.js.map +1 -0
- package/dist/commands/tasks/render.js +253 -0
- package/dist/commands/tasks/render.js.map +1 -0
- package/dist/commands/tasks/tasks.js +119 -0
- package/dist/commands/tasks/tasks.js.map +1 -0
- package/dist/commands/unarchive/manifest.js +176 -0
- package/dist/commands/unarchive/manifest.js.map +1 -0
- package/dist/commands/unarchive/restore.js +254 -0
- package/dist/commands/unarchive/restore.js.map +1 -0
- package/dist/commands/unarchive/unarchive.js +59 -0
- package/dist/commands/unarchive/unarchive.js.map +1 -0
- package/dist/commands/validate/arch-coverage.js +245 -0
- package/dist/commands/validate/arch-coverage.js.map +1 -0
- package/dist/commands/validate/checks/fleet-shape.js +204 -0
- package/dist/commands/validate/checks/fleet-shape.js.map +1 -0
- package/dist/commands/validate/checks/health-deps.js +58 -0
- package/dist/commands/validate/checks/health-deps.js.map +1 -0
- package/dist/commands/validate/checks/introduced.js +102 -0
- package/dist/commands/validate/checks/introduced.js.map +1 -0
- package/dist/commands/validate/checks/requirements.js +264 -0
- package/dist/commands/validate/checks/requirements.js.map +1 -0
- package/dist/commands/validate/checks/sources.js +85 -0
- package/dist/commands/validate/checks/sources.js.map +1 -0
- package/dist/commands/validate/coverage/covers-after.js +105 -0
- package/dist/commands/validate/coverage/covers-after.js.map +1 -0
- package/dist/commands/validate/feature.js +222 -0
- package/dist/commands/validate/feature.js.map +1 -0
- package/dist/commands/validate/fleet/census.js +93 -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 +371 -0
- package/dist/commands/validate/fleet/landscape.js.map +1 -0
- package/dist/commands/validate/fleet/load.js +118 -0
- package/dist/commands/validate/fleet/load.js.map +1 -0
- package/dist/commands/validate/fleet/map/attest.js +98 -0
- package/dist/commands/validate/fleet/map/attest.js.map +1 -0
- package/dist/commands/validate/fleet/map/bindings.js +107 -0
- package/dist/commands/validate/fleet/map/bindings.js.map +1 -0
- package/dist/commands/validate/fleet/map/consumers.js +244 -0
- package/dist/commands/validate/fleet/map/consumers.js.map +1 -0
- package/dist/commands/validate/fleet/map/isolation.js +116 -0
- package/dist/commands/validate/fleet/map/isolation.js.map +1 -0
- package/dist/commands/validate/fleet/map/usecases.js +54 -0
- package/dist/commands/validate/fleet/map/usecases.js.map +1 -0
- package/dist/commands/validate/fleet/obligations.js +266 -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 +71 -0
- package/dist/commands/validate/fleet/scorecard/print.js.map +1 -0
- package/dist/commands/validate/fleet/scorecard/scorecard.js +162 -0
- package/dist/commands/validate/fleet/scorecard/scorecard.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/views/fleet-project.js +217 -0
- package/dist/commands/validate/fleet/views/fleet-project.js.map +1 -0
- package/dist/commands/validate/fleet/views/ids.js +75 -0
- package/dist/commands/validate/fleet/views/ids.js.map +1 -0
- package/dist/commands/validate/fleet/views/projects.js +278 -0
- package/dist/commands/validate/fleet/views/projects.js.map +1 -0
- package/dist/commands/validate/fleet/views/root-documents.js +83 -0
- package/dist/commands/validate/fleet/views/root-documents.js.map +1 -0
- package/dist/commands/validate/fleet/views/stale.js +52 -0
- package/dist/commands/validate/fleet/views/stale.js.map +1 -0
- package/dist/commands/validate/links/corpus.js +89 -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/render/repeats.js +63 -0
- package/dist/commands/validate/render/repeats.js.map +1 -0
- package/dist/commands/validate/render/rollups.js +115 -0
- package/dist/commands/validate/render/rollups.js.map +1 -0
- package/dist/commands/validate/render/text.js +199 -0
- package/dist/commands/validate/render/text.js.map +1 -0
- package/dist/commands/validate/report.js +145 -0
- package/dist/commands/validate/report.js.map +1 -0
- package/dist/commands/validate/scope.js +113 -0
- package/dist/commands/validate/scope.js.map +1 -0
- package/dist/commands/validate/service/api.js +252 -0
- package/dist/commands/validate/service/api.js.map +1 -0
- package/dist/commands/validate/service/contracts/generated.js +134 -0
- package/dist/commands/validate/service/contracts/generated.js.map +1 -0
- package/dist/commands/validate/service/events/events.js +241 -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 +177 -0
- package/dist/commands/validate/service/evidence-pins.js.map +1 -0
- package/dist/commands/validate/service/model/diverged.js +226 -0
- package/dist/commands/validate/service/model/diverged.js.map +1 -0
- package/dist/commands/validate/service/model/grade.js +163 -0
- package/dist/commands/validate/service/model/grade.js.map +1 -0
- package/dist/commands/validate/service/service.js +310 -0
- package/dist/commands/validate/service/service.js.map +1 -0
- package/dist/commands/validate/service/specs.js +279 -0
- package/dist/commands/validate/service/specs.js.map +1 -0
- package/dist/commands/validate/service/spine.js +148 -0
- package/dist/commands/validate/service/spine.js.map +1 -0
- package/dist/commands/validate/service/usecases/tags.js +113 -0
- package/dist/commands/validate/service/usecases/tags.js.map +1 -0
- package/dist/commands/validate/service/usecases/usecases.js +209 -0
- package/dist/commands/validate/service/usecases/usecases.js.map +1 -0
- package/dist/commands/validate/validate.js +363 -0
- package/dist/commands/validate/validate.js.map +1 -0
- package/dist/commands/verify/cross/diff.js +178 -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 +81 -0
- package/dist/commands/verify/evidence/read.js.map +1 -0
- package/dist/commands/verify/frozen.js +263 -0
- package/dist/commands/verify/frozen.js.map +1 -0
- package/dist/commands/verify/record.js +278 -0
- package/dist/commands/verify/record.js.map +1 -0
- package/dist/commands/verify/report.js +206 -0
- package/dist/commands/verify/report.js.map +1 -0
- package/dist/commands/verify/results.js +328 -0
- package/dist/commands/verify/results.js.map +1 -0
- package/dist/commands/verify/verify.js +220 -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 +266 -0
- package/dist/commands/vouch/pack/print.js.map +1 -0
- package/dist/commands/vouch/pack/sections.js +141 -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 +230 -0
- package/dist/commands/vouch/run.js.map +1 -0
- package/dist/commands/vouch/sample/plan.js +111 -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 +155 -0
- package/dist/commands/vouch/vet/verify.js.map +1 -0
- package/dist/commands/vouch/vouch.js +169 -0
- package/dist/commands/vouch/vouch.js.map +1 -0
- package/dist/core/agent/agents-md/command-map.js +299 -0
- package/dist/core/agent/agents-md/command-map.js.map +1 -0
- package/dist/core/agent/agents-md/map/explain.js +46 -0
- package/dist/core/agent/agents-md/map/explain.js.map +1 -0
- package/dist/core/agent/agents-md/map/lenses/context.js +50 -0
- package/dist/core/agent/agents-md/map/lenses/context.js.map +1 -0
- package/dist/core/agent/agents-md/map/lenses/diff.js +59 -0
- package/dist/core/agent/agents-md/map/lenses/diff.js.map +1 -0
- package/dist/core/agent/agents-md/map/lenses/gate.js +65 -0
- package/dist/core/agent/agents-md/map/lenses/gate.js.map +1 -0
- package/dist/core/agent/agents-md/map/mcp.js +44 -0
- package/dist/core/agent/agents-md/map/mcp.js.map +1 -0
- package/dist/core/agent/agents-md/map/status.js +78 -0
- package/dist/core/agent/agents-md/map/status.js.map +1 -0
- package/dist/core/agent/agents-md/map/subsystem.js +104 -0
- package/dist/core/agent/agents-md/map/subsystem.js.map +1 -0
- package/dist/core/agent/agents-md/map/usecases.js +138 -0
- package/dist/core/agent/agents-md/map/usecases.js.map +1 -0
- package/dist/core/agent/agents-md/refusals.js +273 -0
- package/dist/core/agent/agents-md/refusals.js.map +1 -0
- package/dist/core/agent/agents-md.js +203 -0
- package/dist/core/agent/agents-md.js.map +1 -0
- package/dist/core/{agents-stamp.js → agent/agents-stamp.js} +60 -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 +254 -0
- package/dist/core/agent/scaffold.js.map +1 -0
- package/dist/core/agent/support/report.js +144 -0
- package/dist/core/agent/support/report.js.map +1 -0
- package/dist/core/agent/tools/dialects.js +151 -0
- package/dist/core/agent/tools/dialects.js.map +1 -0
- package/dist/core/agent/tools/registry.js +193 -0
- package/dist/core/agent/tools/registry.js.map +1 -0
- package/dist/core/agent/workflows/adopt.js +280 -0
- package/dist/core/agent/workflows/adopt.js.map +1 -0
- package/dist/core/agent/workflows/check.js +373 -0
- package/dist/core/agent/workflows/check.js.map +1 -0
- package/dist/core/agent/workflows/closing.js +323 -0
- package/dist/core/agent/workflows/closing.js.map +1 -0
- package/dist/core/agent/workflows/feature.js +220 -0
- package/dist/core/agent/workflows/feature.js.map +1 -0
- package/dist/core/agent/workflows/implement.js +188 -0
- package/dist/core/agent/workflows/implement.js.map +1 -0
- package/dist/core/agent/workflows/reference/authoring.js +311 -0
- package/dist/core/agent/workflows/reference/authoring.js.map +1 -0
- package/dist/core/agent/workflows/reference/codes.js +67 -0
- package/dist/core/agent/workflows/reference/codes.js.map +1 -0
- package/dist/core/agent/workflows/reference/done-check.js +210 -0
- package/dist/core/agent/workflows/reference/done-check.js.map +1 -0
- package/dist/core/agent/workflows/reference/drawing/drawing.js +253 -0
- package/dist/core/agent/workflows/reference/drawing/drawing.js.map +1 -0
- package/dist/core/agent/workflows/reference/reference.js +19 -0
- package/dist/core/agent/workflows/reference/reference.js.map +1 -0
- package/dist/core/agent/workflows/reference/spine.js +338 -0
- package/dist/core/agent/workflows/reference/spine.js.map +1 -0
- package/dist/core/asyncapi/baseline/plan.js +43 -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 +146 -0
- package/dist/core/asyncapi/digest.js.map +1 -0
- package/dist/core/asyncapi/merge/components.js +92 -0
- package/dist/core/asyncapi/merge/components.js.map +1 -0
- package/dist/core/asyncapi/merge/error.js +38 -0
- package/dist/core/asyncapi/merge/error.js.map +1 -0
- package/dist/core/asyncapi/merge/markers.js +290 -0
- package/dist/core/asyncapi/merge/markers.js.map +1 -0
- package/dist/core/asyncapi/merge/merge.js +195 -0
- package/dist/core/asyncapi/merge/merge.js.map +1 -0
- package/dist/core/asyncapi/merge/pin.js +83 -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 +263 -0
- package/dist/core/asyncapi/read.js.map +1 -0
- package/dist/core/brief/brief.js +285 -0
- package/dist/core/brief/brief.js.map +1 -0
- package/dist/core/brief/checks.js +385 -0
- package/dist/core/brief/checks.js.map +1 -0
- package/dist/core/brief/landscape.js +273 -0
- package/dist/core/brief/landscape.js.map +1 -0
- package/dist/core/brief/map/extend.js +84 -0
- package/dist/core/brief/map/extend.js.map +1 -0
- package/dist/core/brief/map/owed.js +266 -0
- package/dist/core/brief/map/owed.js.map +1 -0
- package/dist/core/brief/targets.js +304 -0
- package/dist/core/brief/targets.js.map +1 -0
- package/dist/core/brief/unchecked.js +58 -0
- package/dist/core/brief/unchecked.js.map +1 -0
- package/dist/core/c4/arch.js +190 -0
- package/dist/core/c4/arch.js.map +1 -0
- package/dist/core/c4/direction/direction.js +114 -0
- package/dist/core/c4/direction/direction.js.map +1 -0
- package/dist/core/c4/likec4.js +243 -0
- package/dist/core/c4/likec4.js.map +1 -0
- package/dist/core/c4/locate/unlocated.js +150 -0
- package/dist/core/c4/locate/unlocated.js.map +1 -0
- package/dist/core/c4/parsed/deployment.js +160 -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 +110 -0
- package/dist/core/c4/parsed/values.js.map +1 -0
- package/dist/core/c4/parsed/view-ids.js +113 -0
- package/dist/core/c4/parsed/view-ids.js.map +1 -0
- package/dist/core/c4/prefetch/fleet.js +134 -0
- package/dist/core/c4/prefetch/fleet.js.map +1 -0
- package/dist/core/c4/project/architecture.js +161 -0
- package/dist/core/c4/project/architecture.js.map +1 -0
- package/dist/core/c4/project/batch.js +140 -0
- package/dist/core/c4/project/batch.js.map +1 -0
- package/dist/core/c4/project/documents.js +89 -0
- package/dist/core/c4/project/documents.js.map +1 -0
- package/dist/core/c4/project/load.js +219 -0
- package/dist/core/c4/project/load.js.map +1 -0
- package/dist/core/c4/project/staged.js +277 -0
- package/dist/core/c4/project/staged.js.map +1 -0
- package/dist/core/c4/resolve/attested.js +0 -0
- package/dist/core/c4/resolve/attested.js.map +1 -0
- package/dist/core/c4/resolve/external.js +51 -0
- package/dist/core/c4/resolve/external.js.map +1 -0
- package/dist/core/c4/resolve/service.js +174 -0
- package/dist/core/c4/resolve/service.js.map +1 -0
- package/dist/core/c4/resolve/steps.js +290 -0
- package/dist/core/c4/resolve/steps.js.map +1 -0
- package/dist/core/c4/resolve/systems.js +154 -0
- package/dist/core/c4/resolve/systems.js.map +1 -0
- package/dist/core/c4/root-project/exclude.js +352 -0
- package/dist/core/c4/root-project/exclude.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 +173 -0
- package/dist/core/c4/seed/template.js.map +1 -0
- package/dist/core/c4/service-model/created/models.js +96 -0
- package/dist/core/c4/service-model/created/models.js.map +1 -0
- package/dist/core/c4/service-model/documents.js +47 -0
- package/dist/core/c4/service-model/documents.js.map +1 -0
- package/dist/core/c4/service-model/fleet/extending.js +82 -0
- package/dist/core/c4/service-model/fleet/extending.js.map +1 -0
- package/dist/core/c4/service-model/load.js +165 -0
- package/dist/core/c4/service-model/load.js.map +1 -0
- package/dist/core/c4/service-model/renderer.js +128 -0
- package/dist/core/c4/service-model/renderer.js.map +1 -0
- package/dist/core/c4/service-model/shape.js +106 -0
- package/dist/core/c4/service-model/shape.js.map +1 -0
- package/dist/core/c4/service-model/slice.js +188 -0
- package/dist/core/c4/service-model/slice.js.map +1 -0
- package/dist/core/c4/source-mask.js +369 -0
- package/dist/core/c4/source-mask.js.map +1 -0
- package/dist/core/c4/source-scan.js +308 -0
- package/dist/core/c4/source-scan.js.map +1 -0
- package/dist/core/c4/splice/authored-source.js +167 -0
- package/dist/core/c4/splice/authored-source.js.map +1 -0
- package/dist/core/c4/splice/contract.js +30 -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/declared.js +87 -0
- package/dist/core/c4/splice/identity/declared.js.map +1 -0
- package/dist/core/c4/splice/identity/edges.js +73 -0
- package/dist/core/c4/splice/identity/edges.js.map +1 -0
- package/dist/core/c4/splice/identity/existing.js +80 -0
- package/dist/core/c4/splice/identity/existing.js.map +1 -0
- package/dist/core/c4/splice/identity/interior.js +80 -0
- package/dist/core/c4/splice/identity/interior.js.map +1 -0
- package/dist/core/c4/splice/identity/owner.js +50 -0
- package/dist/core/c4/splice/identity/owner.js.map +1 -0
- package/dist/core/c4/splice/landscape-merge.js +337 -0
- package/dist/core/c4/splice/landscape-merge.js.map +1 -0
- package/dist/core/c4/splice/model/merge.js +151 -0
- package/dist/core/c4/splice/model/merge.js.map +1 -0
- package/dist/core/c4/splice/placement.js +298 -0
- package/dist/core/c4/splice/placement.js.map +1 -0
- package/dist/core/c4/splice/text/spot.js +131 -0
- package/dist/core/c4/splice/text/spot.js.map +1 -0
- package/dist/core/c4/workspace.js +166 -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 +47 -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 +338 -0
- package/dist/core/capabilities/findings.js.map +1 -0
- package/dist/core/capabilities/realizes/findings.js +174 -0
- package/dist/core/capabilities/realizes/findings.js.map +1 -0
- package/dist/core/capabilities/realizes/join.js +123 -0
- package/dist/core/capabilities/realizes/join.js.map +1 -0
- package/dist/core/capabilities/rollup.js +205 -0
- package/dist/core/capabilities/rollup.js.map +1 -0
- package/dist/core/capabilities/tree.js +104 -0
- package/dist/core/capabilities/tree.js.map +1 -0
- package/dist/core/capabilities/usecase-join.js +267 -0
- package/dist/core/capabilities/usecase-join.js.map +1 -0
- package/dist/core/coherence/authoring/scaffold.js +185 -0
- package/dist/core/coherence/authoring/scaffold.js.map +1 -0
- package/dist/core/coherence/authoring/sentinels.js +75 -0
- package/dist/core/coherence/authoring/sentinels.js.map +1 -0
- package/dist/core/coherence/calls/called.js +52 -0
- package/dist/core/coherence/calls/called.js.map +1 -0
- package/dist/core/coherence/coherence.js +332 -0
- package/dist/core/coherence/coherence.js.map +1 -0
- package/dist/core/coherence/consumed/operations.js +70 -0
- package/dist/core/coherence/consumed/operations.js.map +1 -0
- package/dist/core/coherence/consumed/refusal.js +38 -0
- package/dist/core/coherence/consumed/refusal.js.map +1 -0
- package/dist/core/coherence/covers/health.js +85 -0
- package/dist/core/coherence/covers/health.js.map +1 -0
- package/dist/core/coherence/declared.js +295 -0
- package/dist/core/coherence/declared.js.map +1 -0
- package/dist/core/coherence/events/declared.js +191 -0
- package/dist/core/coherence/events/declared.js.map +1 -0
- package/dist/core/coherence/events/events.js +335 -0
- package/dist/core/coherence/events/events.js.map +1 -0
- package/dist/core/coherence/events/grades.js +189 -0
- package/dist/core/coherence/events/grades.js.map +1 -0
- package/dist/core/coherence/events/lookups.js +63 -0
- package/dist/core/coherence/events/lookups.js.map +1 -0
- package/dist/core/coherence/events/produced.js +100 -0
- package/dist/core/coherence/events/produced.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 +95 -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/coherence/retired/archived.js +285 -0
- package/dist/core/coherence/retired/archived.js.map +1 -0
- package/dist/core/coherence/retired/event-pair.js +62 -0
- package/dist/core/coherence/retired/event-pair.js.map +1 -0
- package/dist/core/coherence/retired/merged.js +79 -0
- package/dist/core/coherence/retired/merged.js.map +1 -0
- package/dist/core/coherence/retired/retirement.js +49 -0
- package/dist/core/coherence/retired/retirement.js.map +1 -0
- package/dist/core/coherence/retired/revival/arrivals.js +131 -0
- package/dist/core/coherence/retired/revival/arrivals.js.map +1 -0
- package/dist/core/coherence/retired/revival/revived.js +297 -0
- package/dist/core/coherence/retired/revival/revived.js.map +1 -0
- package/dist/core/conflict-markers.js +60 -0
- package/dist/core/conflict-markers.js.map +1 -0
- package/dist/core/consumers/after.js +113 -0
- package/dist/core/consumers/after.js.map +1 -0
- package/dist/core/consumers/consumers.js +296 -0
- package/dist/core/consumers/consumers.js.map +1 -0
- package/dist/core/consumers/current.js +211 -0
- package/dist/core/consumers/current.js.map +1 -0
- package/dist/core/consumers/scan.js +46 -0
- package/dist/core/consumers/scan.js.map +1 -0
- package/dist/core/consumers/state.js +27 -0
- package/dist/core/consumers/state.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 +341 -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 +191 -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 +230 -0
- package/dist/core/diff/base-git.js.map +1 -0
- package/dist/core/diff/base-state.js +237 -0
- package/dist/core/diff/base-state.js.map +1 -0
- package/dist/core/diff/joins.js +136 -0
- package/dist/core/diff/joins.js.map +1 -0
- package/dist/core/diff/scope/changed-paths.js +204 -0
- package/dist/core/diff/scope/changed-paths.js.map +1 -0
- package/dist/core/diff/scope/edges.js +82 -0
- package/dist/core/diff/scope/edges.js.map +1 -0
- package/dist/core/diff/semantic.js +312 -0
- package/dist/core/diff/semantic.js.map +1 -0
- package/dist/core/docs.js +37 -85
- package/dist/core/docs.js.map +1 -1
- package/dist/core/doctor/agents.js +238 -0
- package/dist/core/doctor/agents.js.map +1 -0
- package/dist/core/doctor/config.js +139 -0
- package/dist/core/doctor/config.js.map +1 -0
- package/dist/core/doctor/doctor.js +355 -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/reports/scan.js +242 -0
- package/dist/core/doctor/reports/scan.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 +224 -0
- package/dist/core/document/apply.js.map +1 -0
- package/dist/core/{frontmatter.js → document/frontmatter.js} +103 -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 +286 -0
- package/dist/core/document/parse.js.map +1 -0
- package/dist/core/document/scenarios.js +238 -0
- package/dist/core/document/scenarios.js.map +1 -0
- package/dist/core/document/spec.js +234 -0
- package/dist/core/document/spec.js.map +1 -0
- package/dist/core/{config.js → envelope/config.js} +89 -18
- package/dist/core/envelope/config.js.map +1 -0
- package/dist/core/envelope/json.js +209 -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 +180 -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 +194 -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/documents.js +227 -0
- package/dist/core/explain/terms/documents.js.map +1 -0
- package/dist/core/explain/terms/done-check.js +144 -0
- package/dist/core/explain/terms/done-check.js.map +1 -0
- package/dist/core/explain/terms/entry.js +14 -0
- package/dist/core/explain/terms/entry.js.map +1 -0
- package/dist/core/explain/terms/stages.js +71 -0
- package/dist/core/explain/terms/stages.js.map +1 -0
- package/dist/core/explain/terms/tasks.js +97 -0
- package/dist/core/explain/terms/tasks.js.map +1 -0
- package/dist/core/explain/terms.js +103 -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/explore.js +204 -0
- package/dist/core/explore/explore.js.map +1 -0
- package/dist/core/fleet-context.js +174 -146
- package/dist/core/fleet-context.js.map +1 -1
- package/dist/core/gate/checks.js +208 -0
- package/dist/core/gate/checks.js.map +1 -0
- package/dist/core/gate/partners.js +246 -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 +176 -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 +210 -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 +109 -0
- package/dist/core/glossary/delta.js.map +1 -0
- package/dist/core/glossary/tree.js +73 -0
- package/dist/core/glossary/tree.js.map +1 -0
- package/dist/core/{concurrency.js → kernel/concurrency.js} +19 -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/fqn/ancestors.js +65 -0
- package/dist/core/kernel/ids/fqn/ancestors.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} +56 -4
- package/dist/core/kernel/path-safety.js.map +1 -0
- package/dist/core/{records.js → kernel/records.js} +11 -0
- package/dist/core/kernel/records.js.map +1 -0
- package/dist/core/links/backlinks.js +66 -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 +118 -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 +265 -0
- package/dist/core/links/parse.js.map +1 -0
- package/dist/core/mcp/argv.js +212 -0
- package/dist/core/mcp/argv.js.map +1 -0
- package/dist/core/mcp/author-tools.js +73 -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 +324 -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 +207 -0
- package/dist/core/openapi/baseline/gate.js.map +1 -0
- package/dist/core/openapi/baseline/plan.js +142 -0
- package/dist/core/openapi/baseline/plan.js.map +1 -0
- package/dist/core/openapi/baseline/record.js +174 -0
- package/dist/core/openapi/baseline/record.js.map +1 -0
- package/dist/core/openapi/contract-text.js +33 -0
- package/dist/core/openapi/contract-text.js.map +1 -0
- package/dist/core/openapi/contract-tree.js +301 -0
- package/dist/core/openapi/contract-tree.js.map +1 -0
- package/dist/core/openapi/depth.js +136 -0
- package/dist/core/openapi/depth.js.map +1 -0
- package/dist/core/openapi/digest.js +239 -0
- package/dist/core/openapi/digest.js.map +1 -0
- package/dist/core/{openapi.js → openapi/doc.js} +54 -108
- package/dist/core/openapi/doc.js.map +1 -0
- package/dist/core/openapi/merge/components.js +199 -0
- package/dist/core/openapi/merge/components.js.map +1 -0
- package/dist/core/openapi/merge/error.js +16 -0
- package/dist/core/openapi/merge/error.js.map +1 -0
- package/dist/core/openapi/merge/markers.js +204 -0
- package/dist/core/openapi/merge/markers.js.map +1 -0
- package/dist/core/openapi/merge/merge.js +232 -0
- package/dist/core/openapi/merge/merge.js.map +1 -0
- package/dist/core/openapi/merge/pin.js +110 -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 +220 -0
- package/dist/core/openspec/inventory.js.map +1 -0
- package/dist/core/openspec/model/mapping.js +78 -0
- package/dist/core/openspec/model/mapping.js.map +1 -0
- package/dist/core/openspec/model/model.js +70 -0
- package/dist/core/openspec/model/model.js.map +1 -0
- package/dist/core/openspec/scan/changes.js +241 -0
- package/dist/core/openspec/scan/changes.js.map +1 -0
- package/dist/core/openspec/scan/config.js +191 -0
- package/dist/core/openspec/scan/config.js.map +1 -0
- package/dist/core/openspec/scan/shape.js +304 -0
- package/dist/core/openspec/scan/shape.js.map +1 -0
- package/dist/core/openspec/scan/walk.js +116 -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 +157 -0
- package/dist/core/pack/living.js.map +1 -0
- package/dist/core/pack/pack.js +120 -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/projection/introduced.js +14 -0
- package/dist/core/projection/introduced.js.map +1 -0
- package/dist/core/provenance/findings.js +244 -0
- package/dist/core/provenance/findings.js.map +1 -0
- package/dist/core/provenance/git.js +201 -0
- package/dist/core/provenance/git.js.map +1 -0
- package/dist/core/provenance/gitq/moves.js +139 -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 +280 -0
- package/dist/core/provenance/sources.js.map +1 -0
- package/dist/core/provenance/stamp.js +220 -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 +322 -0
- package/dist/core/repo/paths.js.map +1 -0
- package/dist/core/repo/repo.js +308 -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 +61 -0
- package/dist/core/repo/tree/find.js.map +1 -0
- package/dist/core/repo/tree/fs.js +90 -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/render/body.js +258 -0
- package/dist/core/repo/tree/render/body.js.map +1 -0
- package/dist/core/repo/tree/render/projects.js +182 -0
- package/dist/core/repo/tree/render/projects.js.map +1 -0
- package/dist/core/repo/tree/render/service/header.js +125 -0
- package/dist/core/repo/tree/render/service/header.js.map +1 -0
- package/dist/core/repo/tree/render/service/peers.js +28 -0
- package/dist/core/repo/tree/render/service/peers.js.map +1 -0
- package/dist/core/repo/tree/render/service/view-id.js +67 -0
- package/dist/core/repo/tree/render/service/view-id.js.map +1 -0
- package/dist/core/repo/tree/render/service/views.js +78 -0
- package/dist/core/repo/tree/render/service/views.js.map +1 -0
- package/dist/core/repo/tree/render/stale.js +42 -0
- package/dist/core/repo/tree/render/stale.js.map +1 -0
- package/dist/core/repo/tree/render/text.js +84 -0
- package/dist/core/repo/tree/render/text.js.map +1 -0
- package/dist/core/repo/tree/render/views.js +293 -0
- package/dist/core/repo/tree/render/views.js.map +1 -0
- package/dist/core/repo/tree/walk.js +255 -0
- package/dist/core/repo/tree/walk.js.map +1 -0
- package/dist/core/results.js +146 -14
- package/dist/core/results.js.map +1 -1
- package/dist/core/scaffold/landscape.js +239 -0
- package/dist/core/scaffold/landscape.js.map +1 -0
- package/dist/core/scaffold/legacy.js +271 -0
- package/dist/core/scaffold/legacy.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 +252 -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 +268 -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 +95 -0
- package/dist/core/staging/recovery/intent.js.map +1 -0
- package/dist/core/staging/recovery/recover.js +204 -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/manifest.js +188 -0
- package/dist/core/staging/snapshot/manifest.js.map +1 -0
- package/dist/core/staging/snapshot/snapshot.js +196 -0
- package/dist/core/staging/snapshot/snapshot.js.map +1 -0
- package/dist/core/staging/txn/forward.js +181 -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 +60 -0
- package/dist/core/status/actions/execution.js.map +1 -0
- package/dist/core/status/contracts.js +126 -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 +214 -0
- package/dist/core/status/feature/feature.js.map +1 -0
- package/dist/core/status/feature/next.js +163 -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/feature/words.js +96 -0
- package/dist/core/status/feature/words.js.map +1 -0
- package/dist/core/status/fleet/fleet.js +216 -0
- package/dist/core/status/fleet/fleet.js.map +1 -0
- package/dist/core/status/fleet/next.js +302 -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 +216 -0
- package/dist/core/status/verification.js.map +1 -0
- package/dist/core/tasks/packet.js +199 -0
- package/dist/core/tasks/packet.js.map +1 -0
- package/dist/core/tasks/record.js +43 -0
- package/dist/core/tasks/record.js.map +1 -0
- package/dist/core/tasks/sources.js +181 -0
- package/dist/core/tasks/sources.js.map +1 -0
- package/dist/core/tasks/stamps.js +76 -0
- package/dist/core/tasks/stamps.js.map +1 -0
- package/dist/core/tasks/unit.js +0 -0
- package/dist/core/tasks/unit.js.map +1 -0
- package/dist/core/usecases/capability.js +166 -0
- package/dist/core/usecases/capability.js.map +1 -0
- package/dist/core/usecases/delta/claims.js +140 -0
- package/dist/core/usecases/delta/claims.js.map +1 -0
- package/dist/core/usecases/delta/flows.js +101 -0
- package/dist/core/usecases/delta/flows.js.map +1 -0
- package/dist/core/usecases/delta/modified.js +315 -0
- package/dist/core/usecases/delta/modified.js.map +1 -0
- package/dist/core/usecases/delta/overlay.js +76 -0
- package/dist/core/usecases/delta/overlay.js.map +1 -0
- package/dist/core/usecases/fleet.js +296 -0
- package/dist/core/usecases/fleet.js.map +1 -0
- package/dist/core/usecases/grade/capability-tag.js +93 -0
- package/dist/core/usecases/grade/capability-tag.js.map +1 -0
- package/dist/core/usecases/grade/feature.js +88 -0
- package/dist/core/usecases/grade/feature.js.map +1 -0
- package/dist/core/usecases/grade/requirement-tag.js +94 -0
- package/dist/core/usecases/grade/requirement-tag.js.map +1 -0
- package/dist/core/usecases/grade/steps.js +266 -0
- package/dist/core/usecases/grade/steps.js.map +1 -0
- package/dist/core/usecases/grade/usecases.js +112 -0
- package/dist/core/usecases/grade/usecases.js.map +1 -0
- package/dist/core/usecases/operations.js +123 -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/service/exclude.js +119 -0
- package/dist/core/usecases/service/exclude.js.map +1 -0
- package/dist/core/usecases/service/flows.js +164 -0
- package/dist/core/usecases/service/flows.js.map +1 -0
- package/dist/core/usecases/suites/participants.js +83 -0
- package/dist/core/usecases/suites/participants.js.map +1 -0
- package/dist/core/usecases/suites/suites.js +45 -0
- package/dist/core/usecases/suites/suites.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 +180 -0
- package/dist/core/verify/answers.js.map +1 -0
- package/dist/core/verify/build.js +170 -0
- package/dist/core/verify/build.js.map +1 -0
- package/dist/core/verify/checklist.js +259 -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/location.js +67 -0
- package/dist/core/verify/location.js.map +1 -0
- package/dist/core/verify/pins/lint.js +158 -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/read/file.js +224 -0
- package/dist/core/verify/read/file.js.map +1 -0
- package/dist/core/verify/read/shape.js +169 -0
- package/dist/core/verify/read/shape.js.map +1 -0
- package/dist/core/verify/read/union.js +105 -0
- package/dist/core/verify/read/union.js.map +1 -0
- package/dist/core/verify/record.js +165 -0
- package/dist/core/verify/record.js.map +1 -0
- package/dist/core/verify/store/commit.js +99 -0
- package/dist/core/verify/store/commit.js.map +1 -0
- package/dist/core/verify/store/render.js +61 -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 +59 -0
- package/dist/core/vocabulary/issue.js.map +1 -0
- package/dist/core/vocabulary/maturity.js +216 -0
- package/dist/core/vocabulary/maturity.js.map +1 -0
- package/dist/core/vocabulary/report.js +90 -0
- 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 +232 -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 +336 -0
- package/examples/docs/architecture/obligations.yaml +23 -0
- package/examples/docs/architecture/permissions.yaml +50 -0
- package/examples/docs/architecture/services.likec4 +70 -0
- package/examples/docs/architecture/subsystems.likec4 +18 -0
- package/examples/docs/architecture/usecases/order-notification.likec4 +74 -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 +132 -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 +31 -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 +73 -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 +8 -0
- package/examples/docs/loam.json +3 -0
- package/examples/docs/services/checkout-web/model.likec4 +92 -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 +134 -0
- package/examples/docs/services/order-service/asyncapi.yaml +109 -0
- package/examples/docs/services/order-service/health.yaml +57 -0
- package/examples/docs/services/order-service/model.likec4 +126 -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 +76 -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 +68 -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 +120 -0
- package/examples/docs/services/platform/identity-service/health.yaml +70 -0
- package/examples/docs/services/platform/identity-service/model.likec4 +81 -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 +200 -0
- package/examples/docs/services/platform/notification-service/health.yaml +40 -0
- package/examples/docs/services/platform/notification-service/model.likec4 +97 -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 +0 -320
- 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 +0 -317
- 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 +0 -253
- 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 +0 -225
- 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 +0 -47
- 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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../../src/core/workspace/render.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAY1D;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,qBAAqB,CAAC,GAAW,EAAE,QAAgB;IACjE,MAAM,QAAQ,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC;IACpG,OAAO,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC3C,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,eAAe,CAC7B,OAAmC,EACnC,OAAe;IAEf,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAChC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACvC,MAAM;QACN,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,IAAI,EAAE,qBAAqB,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC;KACxE,CAAC,CAAC,CAAC;IACJ,MAAM,IAAI,GACR,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;IACjG,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC3B,CAAC","sourcesContent":["/**\n * Deterministic `.code-workspace` rendering — pure computation, no printing.\n *\n * The output is a derived file: same members plus same target path must\n * produce the same bytes on every machine, which is why every path is spelled\n * with forward slashes (VS Code and Cursor accept them on Windows too, and\n * they are the one spelling that diffs identically across checkouts) and why\n * the JSON shape follows saveConfig's convention — 2-space indent, trailing\n * newline.\n */\nimport { dirname, isAbsolute, relative } from \"node:path\";\nimport type { WorkspaceMember } from \"./discover.js\";\n\n/** One folder row, still carrying the member it was derived from. */\nexport interface RenderedFolder {\n member: WorkspaceMember;\n /** Exactly what lands in the file's `name`. */\n name: string;\n /** Exactly what lands in the file's `path` — the forward-slash spelling. */\n path: string;\n}\n\n/**\n * The `path` a folder entry gets, from the already-computed relative and the\n * member's absolute path.\n *\n * Split out of `renderWorkspace` because the fallback decision is win32-only\n * on a win32 host — `relative()` answers a cross-drive pair with the ABSOLUTE\n * target, since no `..` chain crosses drives — and a POSIX test host can\n * therefore never steer the platform `relative()` into producing one. Taking\n * `rel` as data lets the suite exercise the branch with win32-shaped input.\n *\n * The drive-letter test backs up `isAbsolute` because that check is also\n * platform-bound: on POSIX, `D:\\other\\svc` reads as a relative name. A POSIX\n * directory literally named `D:` would match too and get the absolute\n * spelling instead of the relative one — a stranger workspace file, but a\n * correct one, and the pathological name is not worth a platform fork here.\n */\nexport function workspacePathSpelling(rel: string, absolute: string): string {\n const spelling = rel === \"\" ? \".\" : isAbsolute(rel) || /^[A-Za-z]:[\\\\/]/.test(rel) ? absolute : rel;\n return spelling.split(/[\\\\/]/).join(\"/\");\n}\n\n/**\n * Render the workspace document for `members`, targeted at `outPath`.\n *\n * Folder paths are relative to the file's own directory, so the committed\n * side-by-side layout opens on every machine that checks it out; a member on\n * another drive keeps its absolute path, because no relative spelling exists.\n * The folders are returned still attached to their members so the command can\n * echo the exact written spelling into its `--json` payload without joining\n * two arrays by position.\n */\nexport function renderWorkspace(\n members: readonly WorkspaceMember[],\n outPath: string,\n): { text: string; folders: RenderedFolder[] } {\n const outDir = dirname(outPath);\n const folders = members.map((member) => ({\n member,\n name: member.name,\n path: workspacePathSpelling(relative(outDir, member.path), member.path),\n }));\n const text =\n JSON.stringify({ folders: folders.map(({ name, path }) => ({ name, path })) }, null, 2) + \"\\n\";\n return { text, folders };\n}\n"]}
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
# The example fleet
|
|
2
|
+
|
|
3
|
+
`docs/` is a complete, runnable loam docs repo. It is small enough to read in one sitting and large
|
|
4
|
+
enough that every row of [SCHEMA.md](../SCHEMA.md)'s canonical-joins table is exercised by something
|
|
5
|
+
— including the joins that only appear once a fleet has more than two services in it.
|
|
6
|
+
|
|
7
|
+
Run it from a clone. `docs/loam.json` is committed and says `"docsDir": "."`, so the tree governs
|
|
8
|
+
itself: every command below resolves to this fleet because it is run from inside it. There is
|
|
9
|
+
nothing to write first and nothing to delete afterwards.
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
cd examples/docs
|
|
13
|
+
loam list # the fleet and its maturity ladder
|
|
14
|
+
loam status # what to do next, derived from the files
|
|
15
|
+
loam validate --all # the gate CI runs
|
|
16
|
+
loam archive FEAT-101 --dry-run # the three-axis merge plan, writing nothing
|
|
17
|
+
loam archive FEAT-112 --dry-run # an operation being retired, writing nothing
|
|
18
|
+
loam verify FEAT-088 # a shipped feature's done-check: attested
|
|
19
|
+
loam verify FEAT-120 # …and its pair, the same check: verified
|
|
20
|
+
loam dependencies # the active-feature graph
|
|
21
|
+
loam list suites # which services each test suite needs up
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Working on loam itself and running from source, use `npx tsx ../../src/cli.ts <args>` in place of
|
|
25
|
+
`loam`. Not `npm run dev --`: npm runs a script from the package root, so it would leave
|
|
26
|
+
`examples/docs` and resolve some other `loam.json` — the fleet it reported would not be this one.
|
|
27
|
+
|
|
28
|
+
`test/examples.test.ts` pins the validate summary, every finding code and the archive plans
|
|
29
|
+
file-for-file, so nothing below can drift away from the code without a test going red.
|
|
30
|
+
|
|
31
|
+
## What is in it
|
|
32
|
+
|
|
33
|
+
Five services, drawn inside one grouping element so the map looks like ordinary grouped C4:
|
|
34
|
+
|
|
35
|
+
| service | what it is here to show |
|
|
36
|
+
|---|---|
|
|
37
|
+
| `checkout-web` | a UI service: page-specs under `ui/pages/`, no `openapi.yaml` of its own, and the one spec in the fleet that names no `sources` |
|
|
38
|
+
| `order-service` | the busiest spine: four operations, a produced event, a consumed event, and a deprecated operation with a feature already open to retire it |
|
|
39
|
+
| `payment-service` | the outbox, the acquirer, and an `arch.spec.md` whose `Covers:` lines reach the C4 model *and* the health signals |
|
|
40
|
+
| `identity-service` | the permission vocabulary's owner, and a deprecated operation whose consumer has not migrated — filed into `services/platform/` |
|
|
41
|
+
| `notification-service` | a service with no HTTP API at all — three consumed messages, one of them from a producer outside the fleet — filed into `services/platform/` |
|
|
42
|
+
|
|
43
|
+
Around them: `kafka` as an `#external` `#platform` system with a topic per channel (edges point at
|
|
44
|
+
the topic, never at the broker), `stripe` and `salesforce` as external systems, and
|
|
45
|
+
`architecture/permissions.yaml` as the fleet's authorization vocabulary.
|
|
46
|
+
|
|
47
|
+
**Three authored capability documents**, which are the business tree rather than the architecture:
|
|
48
|
+
`capabilities/checkout/spec.md`, `capabilities/identity/tokens/spec.md` and
|
|
49
|
+
`capabilities/order-notifications/spec.md`. The third carries the axis's second realizer: its one
|
|
50
|
+
promise — "a placed order produces exactly one confirmation" — is cross-service by construction, so
|
|
51
|
+
no service's `spec.md` can keep it, and `architecture/usecases/order-notification.likec4` claims it
|
|
52
|
+
with `#req-NOTIFY-ONCE` beside its `#cap-` tag. The other two are kept by service requirements
|
|
53
|
+
through `Realizes:`. Both ids are also declared in `architecture/capabilities.yaml` — the vocabulary
|
|
54
|
+
is the union of the two sides, and a name a document elaborates does not have to leave the YAML,
|
|
55
|
+
which is what keeps the metadata (`description`, `owner`) that a document has no field for. The
|
|
56
|
+
nested one carries the lesson: the id `identity/tokens` keeps its slash everywhere it is written, so
|
|
57
|
+
the tree spells it as directories, and `capabilities/identity/` holding no `spec.md` of its own is a
|
|
58
|
+
GROUP and earns no finding. Each requirement in both files is a promise a customer could check,
|
|
59
|
+
names no service, and carries a `Requirement-ID:` — required here, unlike in a service spec, because
|
|
60
|
+
these documents outlive every service that realizes them.
|
|
61
|
+
|
|
62
|
+
**One journey in two suites.** The same use case also carries `#suite-smoke` and
|
|
63
|
+
`#suite-notifications`, both declared in the landscape's `specification` block, so `loam list
|
|
64
|
+
suites` has a real answer: each suite needs `checkout-web`, `order-service` and
|
|
65
|
+
`notification-service` up — the union of the journey's participants, resolved through the same
|
|
66
|
+
element→service join the step grades use (notification-service is found through its filing under
|
|
67
|
+
`platform/`, because the answer is ids, never paths). Two participants resolve to no service and are
|
|
68
|
+
NAMED rather than dropped: `customer`, who drives the flow, and `kafka.orderEvents`, which is
|
|
69
|
+
`#external` through its `topic` kind and wants a double on the test stand. One journey in both
|
|
70
|
+
suites is the point of the tag: a directory could file it in only one. The suite tags change
|
|
71
|
+
nothing `validate` says here — the view was already graded through its `#cap-` tag — but on a view
|
|
72
|
+
carrying ONLY `#suite-` tags they are the opt-in, and its hops are graded like any other use case's.
|
|
73
|
+
|
|
74
|
+
**Two glossary terms**, `glossary/order.md` and the nested `glossary/payments/authorization.md`,
|
|
75
|
+
each cited from the capability documents that use the word. This is the axis's whole mechanism in
|
|
76
|
+
two files: the citation is an ordinary markdown link, so `loam validate` resolves it like any other
|
|
77
|
+
and `loam list glossary` can answer "which documents use this term" as a join rather than a grep.
|
|
78
|
+
The two terms also cite EACH OTHER, which is deliberate — a glossary is a network of definitions —
|
|
79
|
+
and that reciprocal pair is exactly what does NOT count as adoption: both terms stay out of
|
|
80
|
+
`glossary.unlinked` because a capability document cites them, not because they cite each other.
|
|
81
|
+
Delete either of those two capability citations and the example gains a tenth warning.
|
|
82
|
+
|
|
83
|
+
**One architectural obligation, declared and applied and met** — which is three files agreeing, and
|
|
84
|
+
the axis's whole mechanism. `architecture/adrs/0001-transactional-outbox.md` says WHAT was decided;
|
|
85
|
+
`#obl-outbox` on the `payment-service → kafka.paymentEvents` edge in the fleet map says WHERE it
|
|
86
|
+
holds (on the publish edge, not on the service — payment-service also serves an API that owes
|
|
87
|
+
nothing of the kind); `architecture/obligations.yaml` declares the name so a mistyped tag is an
|
|
88
|
+
error rather than a word nobody notices; and `ARCH-PAY-OUTBOX` in payment-service's `arch.spec.md`
|
|
89
|
+
covers that same edge, which is the team saying it is met. Because all four line up, the example is
|
|
90
|
+
SILENT about the outbox — the working join produces no finding, which is what a working join should
|
|
91
|
+
do. The second declaration, `idempotency-key`, is the one that talks: it is declared and placed
|
|
92
|
+
nowhere, and `obligation.unapplied` is the warning in the table below.
|
|
93
|
+
|
|
94
|
+
**On the event spine the arrow follows the message** — producer → topic for `publishes`, topic →
|
|
95
|
+
consumer for `consumes` — and that is load-bearing rather than aesthetic. `publishes` binds the
|
|
96
|
+
edge's source and `consumes` binds its target, so a consume edge drawn the other way round binds to
|
|
97
|
+
nothing: the metadata parses, the document validates, and no contract is checked against the link.
|
|
98
|
+
`spine.message-unbound` (warn) is what reports it, on the service at the end the key did not bind;
|
|
99
|
+
SCHEMA.md's *Which way an edge points* lists every reader of the arrow and the drawing each expects.
|
|
100
|
+
|
|
101
|
+
## Four features, at four points in their life
|
|
102
|
+
|
|
103
|
+
The two archived ones are a **matched pair**, and the pairing is the point: same command, same
|
|
104
|
+
shape of record, two different verdicts. A showcase that demonstrated only one would teach that the
|
|
105
|
+
distinction is decorative — and keeping those two answers apart is most of what loam claims to be
|
|
106
|
+
for.
|
|
107
|
+
|
|
108
|
+
- **`features/archive/FEAT-088-refunds/`** — shipped, and **`attested`**. It was merged by the real
|
|
109
|
+
`loam archive`, so its `.loam-before/` snapshot holds the exact bytes the merge overwrote and
|
|
110
|
+
`loam unarchive FEAT-088` would put them back. Its `verification.yaml` is the done-check written
|
|
111
|
+
down — recorded all at once, so it is the one file (a feature recorded per service carries one
|
|
112
|
+
`verification/<svc>.yaml` per attesting service instead): every claim is confirmed, but the
|
|
113
|
+
scenario claims rest on an agent's word instead of a digest-matched test run. loam does not
|
|
114
|
+
pretend those are the same thing.
|
|
115
|
+
- **`features/archive/FEAT-120-refund-notification/`** — shipped, and **`verified`**. The sequel
|
|
116
|
+
FEAT-088 left open: the money went back and nobody told the customer. It publishes
|
|
117
|
+
`payment.PaymentRefunded` from payment-service and has notification-service turn it into the
|
|
118
|
+
message the customer is waiting for — so it exercises the event spine end to end, across two
|
|
119
|
+
services, with no HTTP anywhere in it.
|
|
120
|
+
|
|
121
|
+
Its five scenario claims were answered by `--results` from the `scenario-report.json` beside it:
|
|
122
|
+
loam's own runner-neutral `{"loamScenarioReport": 1, …}` shape, which any runner can be adapted
|
|
123
|
+
into. Its two `event.declares` claims still rest on an agent's word. That mix is the honest
|
|
124
|
+
common case — a suite that answers the scenarios, and wiring claims a human vouches for — and it
|
|
125
|
+
still reads `verified`, because the verdict turns on the scenario claims alone.
|
|
126
|
+
- **`features/FEAT-101-payment-splitting/`** — in flight, and the big one: a new service arriving
|
|
127
|
+
with its own requirements, architecture requirements and contract, a C4 delta that splices a
|
|
128
|
+
nested element into the living landscape, a `MODIFIED` requirement that **renames its heading**
|
|
129
|
+
while keeping its `Requirement-ID` — loam's rename mechanism — and an **event-contract delta**
|
|
130
|
+
(`specs/payment-service/asyncapi.yaml`) that restates payment-service's living contract under
|
|
131
|
+
`loam rebase`-written `x-loam-based-on` pins and adds one new producer side, so the archive merges
|
|
132
|
+
the new slots and leaves every pinned quote to the living contract's own copy. The restatement is
|
|
133
|
+
there to demonstrate the pin; a real delta holds only the slots it adds, changes or removes.
|
|
134
|
+
- **`features/FEAT-112-retire-order-v1/`** — in flight, and the smallest legal shape: no
|
|
135
|
+
`delta.likec4` at all, because retiring an operation moves no boxes. It carries the two halves
|
|
136
|
+
loam requires together for a removal — a `REMOVED` requirement and an `x-loam-remove: true` marker
|
|
137
|
+
inside the operation object.
|
|
138
|
+
|
|
139
|
+
## The warnings are the lesson
|
|
140
|
+
|
|
141
|
+
`loam validate --all` reports **0 errors and 10 warnings** here, and every one of them is
|
|
142
|
+
deliberate. An example that reported nothing would teach nothing about what these checks catch:
|
|
143
|
+
|
|
144
|
+
| finding | what it is demonstrating |
|
|
145
|
+
|---|---|
|
|
146
|
+
| `sources.absent` | `checkout-web`'s spec names no `sources`, so nothing ties it to code and `loam vouch` would refuse to stamp it |
|
|
147
|
+
| `spine.op-link-missing` | one landscape edge says it calls payment-service and names no operation, so no check can tell whether the call still exists |
|
|
148
|
+
| `spine.op-deprecated` | payment-service still calls identity-service's `validateToken`, which that contract marks `deprecated: true` — the consumer, not the provider, is the one being told |
|
|
149
|
+
| `api.requirement-deprecated` (×2) | `IDN-VALIDATE-LEGACY` and `ORD-PLACE-V1` each govern only a deprecated operation: promised behaviour on its way out |
|
|
150
|
+
| `permissions.unenforced` | `user/profile:read` is declared in the vocabulary and named by no requirement — the shape a vocabulary drifts into |
|
|
151
|
+
| `capability.unrealized` | `payments/settlement` is declared in `architecture/capabilities.yaml` and no living requirement's `Capability:` line names it — a promise nobody implemented, or a word nobody adopted; `loam list capabilities` shows it as `0 — unrealized` beside the realized ones |
|
|
152
|
+
| `capability.requirement-unrealized` | `checkout#CHECKOUT-PRICE-HONOURED` — one promise inside a capability whose OTHER promise three services realize, so the row above says nothing about it. That contrast IS the demonstration: `capability.unrealized` finds a capability nobody claimed, and only this code finds the gap inside a capability that looks healthy. Three requirements do carry `Realizes:` lines — `WEB-CHECKOUT`, `ORD-PLACE` and `PAY-AUTHORIZE` all name `checkout#CHECKOUT-CHARGE-ONCE` — and the fourth promise is simply not implemented, which is a normal state for a business document written ahead of the fleet |
|
|
153
|
+
| `c4.uncovered` | FEAT-101 adds a `checkout-web → payment-split-service` edge that no arch requirement covers, so its architectural obligations would ship untested |
|
|
154
|
+
| `obligation.unapplied` | `idempotency-key` is declared in `architecture/obligations.yaml` and no `#obl-` tag applies it anywhere on the fleet map — a decision that was reversed and left its word behind, or one nobody has placed yet. Its sibling `outbox` IS placed and IS covered, and says nothing: that contrast is the demonstration |
|
|
155
|
+
|
|
156
|
+
**Two of the five are filed into a subsystem.** `services/platform/` (its `subsystem.yaml` is the
|
|
157
|
+
marker — title and description, never members) groups `identity-service` and `notification-service`,
|
|
158
|
+
while the other three sit unfiled — the permanent, normal state a partially organized fleet lives
|
|
159
|
+
in, counted by `loam list` and never a finding. Placement is not identity: both services' specs,
|
|
160
|
+
contracts and digests are byte-identical to their unfiled days, every command addresses them by bare
|
|
161
|
+
id, and `architecture/subsystems.likec4` — GENERATED by `loam subsystem sync`, one view per
|
|
162
|
+
subsystem, one `include` per line — is the only file the grouping added. Its sibling
|
|
163
|
+
`architecture/services.likec4` is the other generated views file and owes the grouping nothing: one
|
|
164
|
+
overview view per service the fleet map draws, filed or not, each declared `of` its service's
|
|
165
|
+
element so every other view drills into it, and each titled by its path so the two files fold into
|
|
166
|
+
one folder tree. Edit the tree with
|
|
167
|
+
`loam subsystem move|rename|rm` and both views files travel in the same transaction; edit either by
|
|
168
|
+
hand and `validate --all` answers `subsystem.views-stale`, naming the file that drifted. (`order-service` and `payment-service` stay
|
|
169
|
+
unfiled deliberately: FEAT-088's committed version-2 snapshot restores them by literal path, and the
|
|
170
|
+
`loam unarchive FEAT-088` walkthrough must keep working byte-for-byte.)
|
|
171
|
+
|
|
172
|
+
**All five models are EXTENDING models, and that is the shape this example teaches.** None of them
|
|
173
|
+
declares a `specification` block, none re-declares a partner, and none has a `likec4.config.json`
|
|
174
|
+
beside it. Each one says what is inside its service with `extend marketplace.<svc> { … }` on the
|
|
175
|
+
element `architecture/landscape.likec4` already binds to its directory, so `kafka`, `stripe`,
|
|
176
|
+
`notification-provider` and every peer service are declared exactly once — in the map — and no two
|
|
177
|
+
documents can disagree about their tags. The root `likec4.config.json` therefore excludes only
|
|
178
|
+
`**/node_modules/**` and `features/**`: `npx likec4 validate examples/docs` names ONE project,
|
|
179
|
+
`fleet`, holding the map and all five models, and needs no `--project` flag. The other shape — a
|
|
180
|
+
model that declares its own `specification` and is parsed alone, which is what every model here was
|
|
181
|
+
before — is still legal and still supported; SCHEMA.md's "Two shapes of a service model" has both,
|
|
182
|
+
the eight grades in its table — seven that came with the pair, plus the one it narrowed
|
|
183
|
+
(`service.likec4-config-missing`, now standalone-only) — and the
|
|
184
|
+
ordered recipe for migrating between them.
|
|
185
|
+
|
|
186
|
+
Two consequences are visible in the tree and worth reading for. Element ids carry their full path,
|
|
187
|
+
so `services/order-service/arch.spec.md` writes `Covers: marketplace.orderService.db` — the
|
|
188
|
+
container has no shorter name, because the model extends an element nested in the `marketplace`
|
|
189
|
+
group. And a cross-boundary call is written **twice** on purpose: container-level in the model
|
|
190
|
+
(`marketplace.notificationService.sender -> notificationProvider`) and service-level in the map
|
|
191
|
+
(`marketplace.notificationService -> notificationProvider`), because every fleet check — the spine,
|
|
192
|
+
`landscape.service-isolated`, the platform census — reads the map alone. ROADMAP.md keeps that
|
|
193
|
+
remainder written down rather than hidden.
|
|
194
|
+
|
|
195
|
+
Plus one count rather than a finding: `sourcesUnverifiableFromHere: 4`. Four specs name paths in
|
|
196
|
+
their own service repositories, and this is none of those repositories — the fleet gate reports the
|
|
197
|
+
blind spot instead of resolving it. Running `loam validate --service <id>` inside each service repo
|
|
198
|
+
is what closes it.
|
|
199
|
+
|
|
200
|
+
## What the example deliberately does not carry
|
|
201
|
+
|
|
202
|
+
- **`AGENTS.md`.** A real docs repo has one, written by `loam init --docs . --create`. It is left
|
|
203
|
+
out here because a generated `AGENTS.md` carries the version stamp of the binary that wrote it,
|
|
204
|
+
and this tree is committed while the binary keeps moving — a stamped copy in the repository would
|
|
205
|
+
be stale by the next release and would say so to every reader of the example.
|
|
206
|
+
|
|
207
|
+
**`loam.json` used to be left out with it**, on the same "keep the tree a pure set of documents"
|
|
208
|
+
reasoning, and that trade was wrong: without it the example could not be RUN. `loam status` here
|
|
209
|
+
answered "No loam.json found" and exited 1, and the workaround this page printed instead — a
|
|
210
|
+
throwaway `loam.json` at the repository root — then governed every other directory in the clone,
|
|
211
|
+
so `loam init` from anywhere below it refused, and forgetting to delete it silently pointed later
|
|
212
|
+
commands at the example fleet. It is committed now, byte-for-byte the two lines `loam init` writes
|
|
213
|
+
for a docs repo that governs itself, which makes `cd examples/docs` the whole of the setup.
|
|
214
|
+
- **`payment-split-service`'s own `asyncapi.yaml`.** The async axis has the full feature lifecycle
|
|
215
|
+
now — FEAT-101's `specs/payment-service/asyncapi.yaml` demonstrates the merge half on a living
|
|
216
|
+
contract — but the NEW service's contract for the drawn `PaymentSplit` edge is deliberately
|
|
217
|
+
deferred: the edge keeps the message in its title and no `metadata { publishes }`, because that
|
|
218
|
+
metadata is a join and the join demands a contract declaring the send
|
|
219
|
+
(`c4-event.message-undefined` refuses one without it). A
|
|
220
|
+
`specs/payment-split-service/asyncapi.yaml` would ride the archive's creation branch once the
|
|
221
|
+
consumer of `PaymentSplit` exists. The comment in `delta.likec4` says so rather than leaving it to
|
|
222
|
+
be discovered.
|
|
223
|
+
- **A generated Gherkin suite.** `loam gherkin` writes into a *service's* repository, and there are
|
|
224
|
+
none here — this fleet is six repositories, and `docs/` is one of them. The same reason leaves
|
|
225
|
+
`sources` unresolvable and every service `draft`: `loam vouch` only runs where the code is, so no
|
|
226
|
+
SERVICE in this tree can be promoted past `draft`.
|
|
227
|
+
|
|
228
|
+
That is a different word from FEAT-120's `verified` verdict and the two must not be read as one.
|
|
229
|
+
A service's ladder rung (`empty → partial → documented → sourced → vouched`) says a human stamped
|
|
230
|
+
its living spec against the code; a feature's verdict says how its claims were answered. FEAT-120
|
|
231
|
+
is `verified` in a fleet whose services are all `draft`, which is exactly the state a team is in
|
|
232
|
+
the day its first suite goes green.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# 0001 — Event publishers write through a transactional outbox
|
|
2
|
+
|
|
3
|
+
Status: accepted
|
|
4
|
+
Date: 2026-08-28
|
|
5
|
+
|
|
6
|
+
## Context
|
|
7
|
+
|
|
8
|
+
A service that writes its own state and then publishes an event about it has two
|
|
9
|
+
places to fail between. The failure is silent and asymmetric: the state change
|
|
10
|
+
lands, the event does not, and every consumer's view of the world is quietly
|
|
11
|
+
wrong until somebody reconciles by hand.
|
|
12
|
+
|
|
13
|
+
## Decision
|
|
14
|
+
|
|
15
|
+
A service that publishes a domain event SHALL write the event and the state
|
|
16
|
+
change it reports in one database transaction, and relay it to the broker
|
|
17
|
+
afterwards. Never a dual write.
|
|
18
|
+
|
|
19
|
+
## Scope
|
|
20
|
+
|
|
21
|
+
This is not a fleet-wide policy every service inherits — that is the shape this
|
|
22
|
+
repository deliberately does not use. It applies where it is tagged: see
|
|
23
|
+
`#obl-outbox` in [the fleet map](../landscape.likec4), which today marks the
|
|
24
|
+
`payment-service → kafka.paymentEvents` edge and nothing else.
|
|
25
|
+
`payment-service`'s [ARCH-PAY-OUTBOX](../../services/payment-service/arch.spec.md)
|
|
26
|
+
is the requirement that keeps it.
|
|
27
|
+
|
|
28
|
+
## Consequences
|
|
29
|
+
|
|
30
|
+
A publisher needs an outbox table and a relay. A consumer must tolerate a
|
|
31
|
+
duplicate: the relay guarantees at-least-once, which is why
|
|
32
|
+
`checkout#CHECKOUT-CHARGE-ONCE` is a promise about the customer's card and not
|
|
33
|
+
about the number of messages.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# The fleet's capability vocabulary, joined to requirements by `Capability:`.
|
|
2
|
+
#
|
|
3
|
+
# Opt-in the OTHER way round from permissions.yaml: the FILE is the opt-in, not the line.
|
|
4
|
+
# A fleet without this file gets no capability findings at all, however many `Capability:`
|
|
5
|
+
# lines its requirements carry; writing it is the moment the axis turns on. `loam validate`
|
|
6
|
+
# then grades both directions — an undeclared name is `capability.unknown` (error, with
|
|
7
|
+
# close-name suggestions), an unreadable file is `capability.invalid` exactly once per run,
|
|
8
|
+
# and a declared capability nothing realizes is `capability.unrealized` (warning, one per
|
|
9
|
+
# capability). `loam list capabilities` reports the whole rollup: which requirements realize
|
|
10
|
+
# each capability, in which services, and how much of that rests on drafts.
|
|
11
|
+
#
|
|
12
|
+
# Ids are flat keys with `/` allowed for nesting — `identity/tokens` is ONE id, exactly the
|
|
13
|
+
# token a requirement writes, never collapsed to `identity`. Descriptions and owners are
|
|
14
|
+
# explanatory; nothing resolves them.
|
|
15
|
+
capabilities:
|
|
16
|
+
checkout:
|
|
17
|
+
description: carry a customer from a filled cart to a confirmed, paid order
|
|
18
|
+
owner: checkout-team
|
|
19
|
+
identity/tokens:
|
|
20
|
+
description: issue and answer for the access tokens every fleet call presents
|
|
21
|
+
owner: platform-identity
|
|
22
|
+
order-notifications:
|
|
23
|
+
description: tell the customer what happened to their order, exactly once per event
|
|
24
|
+
owner: growth-team
|
|
25
|
+
# Declared, and realized by no living requirement anywhere in the fleet — the example's
|
|
26
|
+
# `capability.unrealized` (warning) demonstration. It is the shape this axis exists to
|
|
27
|
+
# make visible: a capability page was agreed in a meeting, the word entered the fleet's
|
|
28
|
+
# vocabulary, and no requirement anywhere claims to implement any part of it.
|
|
29
|
+
payments/settlement:
|
|
30
|
+
description: pay merchants out for captured orders
|
|
31
|
+
owner: payments-team
|
|
@@ -0,0 +1,336 @@
|
|
|
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
|
+
//
|
|
12
|
+
// This file is also the SPECIFICATION every service model borrows. Each
|
|
13
|
+
// `services/<…>/<svc>/model.likec4` here is an EXTENDING model: it declares no
|
|
14
|
+
// kinds and no partners, and says what is inside its service with
|
|
15
|
+
// `extend marketplace.<svc> { … }` on the element below that binds to its
|
|
16
|
+
// directory. The root `likec4.config.json` therefore does NOT exclude
|
|
17
|
+
// `services/**` — the map and every model are ONE LikeC4 project, so an element
|
|
18
|
+
// is declared exactly once and no two documents can disagree about its tags.
|
|
19
|
+
// SCHEMA.md, "Two shapes of a service model", has both shapes and the rule that
|
|
20
|
+
// picks between them; a kind or tag a model needs is added HERE, once.
|
|
21
|
+
specification {
|
|
22
|
+
// A grouping element — it stands for no service and owns no directory. The
|
|
23
|
+
// service checks WALK the tree rather than reading only top-level elements:
|
|
24
|
+
// an element is graded at service level when no ancestor already stands for a
|
|
25
|
+
// service, so nesting the fleet inside a boundary costs nothing, and the
|
|
26
|
+
// group itself never raises `landscape.service-undocumented` because it
|
|
27
|
+
// CONTAINS services rather than being one.
|
|
28
|
+
element group
|
|
29
|
+
element softwareSystem
|
|
30
|
+
// Declared here for the service models, which declare no kinds of their own.
|
|
31
|
+
// FEAT-101's new system draws an `api` container inside it, and archive
|
|
32
|
+
// creates services/payment-split-service/model.likec4 with the service and
|
|
33
|
+
// splices the container in there — never into this file, which holds no
|
|
34
|
+
// service's interior. That model borrows its kinds from this block, so the
|
|
35
|
+
// kind has to be legal HERE for it to parse (archive refuses otherwise).
|
|
36
|
+
element container
|
|
37
|
+
// Declared here for the SERVICE MODELS, and nothing in this file uses it.
|
|
38
|
+
// This fleet writes every `database` element inside the service that owns it,
|
|
39
|
+
// in a `services/<svc>/model.likec4` under `extend marketplace.<svc>` — a
|
|
40
|
+
// CHOICE this example makes, not a rule loam enforces. Drawing an owned store
|
|
41
|
+
// beside the services is equally first-class and earns no finding; what the
|
|
42
|
+
// placement decides is one thing, and it is a fact about LikeC4: a second
|
|
43
|
+
// service's edge naming `marketplace.<svc>.<store>` resolves only against a
|
|
44
|
+
// declaration the MAP holds, because a per-service project is `architecture/`
|
|
45
|
+
// plus one model. So a store a second consumer will name belongs on the map,
|
|
46
|
+
// and one nobody else reaches may live wherever the team finds it clearest.
|
|
47
|
+
// An extending model declares no kinds of its own, so a kind it needs and
|
|
48
|
+
// this block does not declare is ONE parse error on the model — which is what
|
|
49
|
+
// this line prevents.
|
|
50
|
+
element database
|
|
51
|
+
element person
|
|
52
|
+
// A topic is an element, and the kind carries #external rather than each
|
|
53
|
+
// instance doing it: LikeC4 does NOT inherit tags, so a topic nested inside
|
|
54
|
+
// the #external broker is not external itself, and `loam validate --all`
|
|
55
|
+
// would ask for a services/payment.events/ nobody owes
|
|
56
|
+
// (`landscape.service-undocumented`).
|
|
57
|
+
element topic {
|
|
58
|
+
#external
|
|
59
|
+
// The channel is platform too, and the tag has to be HERE rather than on
|
|
60
|
+
// the broker alone: `landscape.platform-candidate` grades each drawn
|
|
61
|
+
// element by how many services consume it, and once the edges point at
|
|
62
|
+
// topics it is the topics that collect three consumers each — tagging only
|
|
63
|
+
// `kafka` would leave three untagged hubs behind.
|
|
64
|
+
#platform
|
|
65
|
+
style {
|
|
66
|
+
shape queue
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
tag external
|
|
70
|
+
// Ubiquitous infrastructure. Three consuming services is where an untagged
|
|
71
|
+
// external hub starts warning (`landscape.platform-candidate`), because that
|
|
72
|
+
// is where one more edge per modelled service stops being a fact about two
|
|
73
|
+
// services and starts being the shape of the map. Tagging keeps both pictures:
|
|
74
|
+
// the fleet view below excludes #platform, and the platform view keeps "who
|
|
75
|
+
// depends on it" answerable during an incident. LikeC4 refuses an undeclared
|
|
76
|
+
// tag, so the declaration here and the tag on the element are both needed.
|
|
77
|
+
tag platform
|
|
78
|
+
// The capability a use case opts in with. `architecture/usecases/` declares
|
|
79
|
+
// no 'specification` of its own — the whole directory is ONE LikeC4 project,
|
|
80
|
+
// and a second declaration there is a duplicate error blamed on both files —
|
|
81
|
+
// so a tag a flow carries is declared here, beside the kinds.
|
|
82
|
+
tag cap-order-notifications
|
|
83
|
+
// The requirement tag beside it: a flow says WHICH of the capability's named
|
|
84
|
+
// promises it keeps, and the id is spelled with every character a tag name
|
|
85
|
+
// cannot carry flattened to `-`. Declared here for the same reason — one
|
|
86
|
+
// specification block serves the whole `architecture/` project.
|
|
87
|
+
tag req-NOTIFY-ONCE
|
|
88
|
+
// The SUITES a flow runs with — `#suite-<name>` on the view, many-to-many, so
|
|
89
|
+
// the one journey below sits in both. Declared here, like every tag, so a
|
|
90
|
+
// mistyped suite is a parse error rather than a second, empty suite.
|
|
91
|
+
// `loam list suites` answers which services each one needs up: the union of
|
|
92
|
+
// its journeys' participants, plus the ones no services/ directory stands for
|
|
93
|
+
// (the customer who drives it, the #external topic in the middle).
|
|
94
|
+
tag suite-smoke
|
|
95
|
+
tag suite-notifications
|
|
96
|
+
// An ARCHITECTURAL OBLIGATION, declared in architecture/obligations.yaml and
|
|
97
|
+
// applied HERE, on the objects it holds for. The decision itself is
|
|
98
|
+
// architecture/adrs/0001-transactional-outbox.md; this tag is the architect
|
|
99
|
+
// saying where it applies, and payment-service's ARCH-PAY-OUTBOX is the team
|
|
100
|
+
// saying it is met. Applied to the edge rather than to the service, because
|
|
101
|
+
// an outbox is a property of publishing, and payment-service also calls an
|
|
102
|
+
// API that owes nothing of the kind.
|
|
103
|
+
tag obl-outbox
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
model {
|
|
107
|
+
customer = person 'Customer'
|
|
108
|
+
|
|
109
|
+
// Our own fleet, drawn inside a boundary the way ordinary grouped C4 is. The
|
|
110
|
+
// group has no `metadata { service }` and no directory under services/: it is
|
|
111
|
+
// scenery for the reader, and every check below resolves through it to the
|
|
112
|
+
// element that really stands for each service.
|
|
113
|
+
marketplace = group 'Marketplace' {
|
|
114
|
+
description 'Everything this organisation runs'
|
|
115
|
+
|
|
116
|
+
checkoutWeb = softwareSystem 'checkout-web' {
|
|
117
|
+
description 'Customer-facing checkout UI'
|
|
118
|
+
metadata {
|
|
119
|
+
service 'checkout-web'
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
orderService = softwareSystem 'order-service' {
|
|
123
|
+
description 'Owns the order lifecycle'
|
|
124
|
+
metadata {
|
|
125
|
+
service 'order-service'
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
paymentService = softwareSystem 'payment-service' {
|
|
129
|
+
description 'Owns payment authorization/capture'
|
|
130
|
+
metadata {
|
|
131
|
+
service 'payment-service'
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
identityService = softwareSystem 'identity-service' {
|
|
135
|
+
description 'Issues and introspects access tokens'
|
|
136
|
+
metadata {
|
|
137
|
+
service 'identity-service'
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
notificationService = softwareSystem 'notification-service' {
|
|
141
|
+
description 'Turns events into customer email and push'
|
|
142
|
+
metadata {
|
|
143
|
+
service 'notification-service'
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
kafka = softwareSystem 'kafka' {
|
|
149
|
+
// Not one of ours: no services/kafka/ is expected, and none is asked for.
|
|
150
|
+
#external
|
|
151
|
+
// Three of our services reach it, which is exactly the count at which the
|
|
152
|
+
// untagged version of this element becomes `landscape.platform-candidate`.
|
|
153
|
+
#platform
|
|
154
|
+
description 'Event backbone'
|
|
155
|
+
// Edges point HERE, not at the broker. Two producers make no difference;
|
|
156
|
+
// sixty do — a broker drawn as one element is the node every service in the
|
|
157
|
+
// fleet points at, and a view over it is a star nobody can read. The topic
|
|
158
|
+
// is also the truer target: what a producer and a consumer share is the
|
|
159
|
+
// channel, never the server it happens to live on.
|
|
160
|
+
paymentEvents = topic 'payment.events'
|
|
161
|
+
orderEvents = topic 'order.events'
|
|
162
|
+
crmEvents = topic 'crm.events'
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
stripe = softwareSystem 'stripe' {
|
|
166
|
+
#external
|
|
167
|
+
description 'Card acquirer'
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
salesforce = softwareSystem 'salesforce' {
|
|
171
|
+
#external
|
|
172
|
+
description 'CRM of record — the fleet reads its events and writes none'
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// Declared HERE rather than in notification-service's model, and that is the
|
|
176
|
+
// rule an extending model turns on: a system a service reaches is the fleet's
|
|
177
|
+
// element, declared once, and a model that declared its own copy would be
|
|
178
|
+
// `c4.element-unowned` (an extending model may only add elements under the
|
|
179
|
+
// element that resolves to its own service). One consumer, so it never
|
|
180
|
+
// becomes `landscape.platform-candidate`; #external, so no
|
|
181
|
+
// services/notification-provider/ is asked for.
|
|
182
|
+
notificationProvider = softwareSystem 'notification-provider' {
|
|
183
|
+
#external
|
|
184
|
+
description 'Third-party email and SMS gateway — quota-limited, and outside this fleet'
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
customer -> marketplace.checkoutWeb 'Uses'
|
|
188
|
+
|
|
189
|
+
// The synchronous spine. Every one of these resolves against the TARGET's
|
|
190
|
+
// openapi.yaml: `loam validate` fails the fleet when an `op` names an
|
|
191
|
+
// operation the callee does not define ('spine.op-undefined`), which is what
|
|
192
|
+
// turns a rename in one repository into a red build in the one that depended
|
|
193
|
+
// on it.
|
|
194
|
+
marketplace.checkoutWeb -> marketplace.orderService 'Calls createOrder' {
|
|
195
|
+
metadata {
|
|
196
|
+
op 'createOrder'
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
marketplace.checkoutWeb -> marketplace.orderService 'Calls getOrder' {
|
|
200
|
+
metadata {
|
|
201
|
+
op 'getOrder'
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
// Deliberately unlinked, and the example's demonstration of
|
|
205
|
+
// 'spine.op-link-missing` (warn): an edge whose title starts with "Call" and
|
|
206
|
+
// carries no `metadata { op }` is drawn but joined to nothing, so no check can
|
|
207
|
+
// tell whether the operation behind it still exists. Every other call edge
|
|
208
|
+
// here carries its op; this one is what the warning looks like.
|
|
209
|
+
marketplace.checkoutWeb -> marketplace.paymentService 'Calls the payment API'
|
|
210
|
+
marketplace.orderService -> marketplace.paymentService 'Calls authorizePayment' {
|
|
211
|
+
metadata {
|
|
212
|
+
op 'authorizePayment'
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
marketplace.orderService -> marketplace.identityService 'Calls introspectToken' {
|
|
216
|
+
metadata {
|
|
217
|
+
op 'introspectToken'
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
// The other half of the deprecation story, and the example's
|
|
221
|
+
// 'spine.op-deprecated` (warn): identity-service still DEFINES validateToken,
|
|
222
|
+
// so the contract holds and this is not an error — but its OpenAPI marks the
|
|
223
|
+
// operation `deprecated: true`, and this edge is the consumer that has not
|
|
224
|
+
// migrated yet. The warning is addressed to payment-service, not to identity.
|
|
225
|
+
marketplace.paymentService -> marketplace.identityService 'Calls validateToken' {
|
|
226
|
+
metadata {
|
|
227
|
+
op 'validateToken'
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
// An edge into a system nobody owns a directory for. It carries no `op`
|
|
231
|
+
// because there is no contract in this repository to resolve one against, and
|
|
232
|
+
// it raises no warning because its title does not claim to be a call into a
|
|
233
|
+
// fleet service.
|
|
234
|
+
marketplace.paymentService -> stripe 'Authorizes cards'
|
|
235
|
+
// The second half of the rule the extending shape keeps: the container that
|
|
236
|
+
// really makes the call is drawn in the service's own model
|
|
237
|
+
// (`marketplace.notificationService.sender -> notificationProvider`), and the
|
|
238
|
+
// SERVICE-level twin is drawn here, because every fleet check — the spine,
|
|
239
|
+
// `landscape.service-isolated`, the platform census — reads this file alone.
|
|
240
|
+
// The edge exists twice on purpose; SCHEMA.md says so where it says the map
|
|
241
|
+
// is the one document holding every cross-service edge.
|
|
242
|
+
marketplace.notificationService -> notificationProvider 'Sends email and SMS'
|
|
243
|
+
|
|
244
|
+
// The event spine, the async mirror of `metadata { op }`: the name must be a
|
|
245
|
+
// message the PRODUCER's own asyncapi.yaml declares an `action: send` for, or
|
|
246
|
+
// 'spine.message-undefined` fires. A consumer's edge carries
|
|
247
|
+
// `metadata { consumes }` instead, and its name has to have a producer
|
|
248
|
+
// SOMEWHERE in the fleet — the one check no single repository can answer.
|
|
249
|
+
//
|
|
250
|
+
// THE ARROW FOLLOWS THE MESSAGE, and that is load-bearing rather than
|
|
251
|
+
// aesthetic. `publishes` binds the edge's SOURCE and `consumes` binds its
|
|
252
|
+
// TARGET, so a consume edge drawn the other way round — `orderService ->
|
|
253
|
+
// kafka.paymentEvents` — binds to nothing at all: the metadata parses and the
|
|
254
|
+
// document validates, and all that says so is `spine.message-unbound` (warn)
|
|
255
|
+
// on the service that drew it. Producer to topic, topic to consumer, every
|
|
256
|
+
// time.
|
|
257
|
+
marketplace.paymentService -> kafka.paymentEvents 'Publishes PaymentAuthorized' {
|
|
258
|
+
#obl-outbox
|
|
259
|
+
metadata {
|
|
260
|
+
publishes 'payment.PaymentAuthorized'
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
marketplace.paymentService -> kafka.paymentEvents 'Publishes PaymentCaptured' {
|
|
264
|
+
metadata {
|
|
265
|
+
publishes 'payment.PaymentCaptured'
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
kafka.paymentEvents -> marketplace.orderService 'PaymentAuthorized advances the order' {
|
|
269
|
+
metadata {
|
|
270
|
+
consumes 'payment.PaymentAuthorized'
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
marketplace.orderService -> kafka.orderEvents 'Publishes OrderPlaced' {
|
|
274
|
+
metadata {
|
|
275
|
+
publishes 'order.OrderPlaced'
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
marketplace.orderService -> marketplace.paymentService 'Calls refundPayment' {
|
|
279
|
+
metadata { op 'refundPayment' }
|
|
280
|
+
}
|
|
281
|
+
kafka.orderEvents -> marketplace.notificationService 'OrderPlaced triggers the confirmation' {
|
|
282
|
+
metadata {
|
|
283
|
+
consumes 'order.OrderPlaced'
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
kafka.paymentEvents -> marketplace.notificationService 'PaymentCaptured triggers the receipt' {
|
|
287
|
+
metadata {
|
|
288
|
+
consumes 'payment.PaymentCaptured'
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
kafka.paymentEvents -> marketplace.notificationService 'PaymentRefunded triggers the refund notice' {
|
|
292
|
+
metadata {
|
|
293
|
+
consumes 'payment.PaymentRefunded'
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
// A producer OUTSIDE the fleet, expressed rather than left implicit. Without
|
|
297
|
+
// this edge notification-service's `consumes 'crm.CustomerUpdated'` would be
|
|
298
|
+
// 'spine.message-unproduced` (error) — nobody in the fleet declares it is
|
|
299
|
+
// sent — and the exit ramp people take from that error is deleting the link.
|
|
300
|
+
// The edge moves the contract question to the one file that can settle it:
|
|
301
|
+
// the consumer's own asyncapi.yaml, which must define the payload
|
|
302
|
+
// ('spine.message-external` fires while it does not).
|
|
303
|
+
salesforce -> kafka.crmEvents 'Publishes CustomerUpdated' {
|
|
304
|
+
metadata {
|
|
305
|
+
publishes 'crm.CustomerUpdated'
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
kafka.crmEvents -> marketplace.notificationService 'CustomerUpdated refreshes contact details' {
|
|
309
|
+
metadata {
|
|
310
|
+
consumes 'crm.CustomerUpdated'
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
// Views are LikeC4's renderer's, never loam's — nothing below is read by any
|
|
316
|
+
// check. Three of them rather than one `include *`, because at fleet scale a
|
|
317
|
+
// single view holding every call is both the slow one to compute and the one
|
|
318
|
+
// nobody can read: the synchronous map, the event spine and the platform
|
|
319
|
+
// dependencies answer different questions and belong on different pages.
|
|
320
|
+
views {
|
|
321
|
+
view landscape {
|
|
322
|
+
title 'Fleet — calls between our own services'
|
|
323
|
+
include *
|
|
324
|
+
exclude element.tag = #external
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
view events {
|
|
328
|
+
title 'Fleet — the event spine'
|
|
329
|
+
include kafka, kafka.*, * -> kafka.*, kafka.* -> *
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
view platform {
|
|
333
|
+
title 'Fleet — who depends on shared infrastructure'
|
|
334
|
+
include element.tag = #platform, * -> element.tag = #platform
|
|
335
|
+
}
|
|
336
|
+
}
|