@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,119 @@
|
|
|
1
|
+
---
|
|
2
|
+
service: identity-service
|
|
3
|
+
status: draft
|
|
4
|
+
owner: platform-identity
|
|
5
|
+
sources:
|
|
6
|
+
- internal/tokens/
|
|
7
|
+
- cmd/
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# identity-service
|
|
11
|
+
|
|
12
|
+
Issues the access tokens every other service in this fleet presents, and answers the
|
|
13
|
+
one question those services cannot answer for themselves: is this token still good?
|
|
14
|
+
This is the **living spec** — the complete current state, the operation on its way
|
|
15
|
+
out included. Feature deltas (ADDED/MODIFIED/REMOVED requirements) merge in here on
|
|
16
|
+
`loam archive`.
|
|
17
|
+
|
|
18
|
+
`status: draft`, and no digest anywhere in the frontmatter: nothing in this directory
|
|
19
|
+
has been vouched. `sources` names the two trees in the service's own repository these
|
|
20
|
+
requirements were written from, so that when `loam validate` runs inside that repo it
|
|
21
|
+
can say whether the code has moved since a human last read it (`sources.current` /
|
|
22
|
+
`sources.stale` / `sources.unvouched`). Writing `status: verified` by hand would be a
|
|
23
|
+
claim about bytes nobody hashed — the exact forgery `loam vouch` exists to make
|
|
24
|
+
impossible, which is why it and it alone writes `sources_digest`, `content_digest`,
|
|
25
|
+
`last_verified` and `vouched_by`.
|
|
26
|
+
|
|
27
|
+
One requirement below, `Answer legacy token validation`, deliberately draws
|
|
28
|
+
`api.requirement-deprecated`: it governs only an operation this service's OpenAPI
|
|
29
|
+
marks `deprecated: true`. That warning is the point — it is how a fleet sees, from
|
|
30
|
+
`loam validate` rather than from a migration wiki, which promised behaviour is being
|
|
31
|
+
retired and has not finished going.
|
|
32
|
+
|
|
33
|
+
## Requirements
|
|
34
|
+
|
|
35
|
+
### Requirement: Issue an access token
|
|
36
|
+
|
|
37
|
+
Requirement-ID: IDN-ISSUE
|
|
38
|
+
The service SHALL issue a signed, expiring access token to a client that presents
|
|
39
|
+
valid credentials, and SHALL refuse every other caller with one indistinguishable
|
|
40
|
+
refusal — a response that reveals which half of the credential was wrong turns the
|
|
41
|
+
token endpoint into a client-enumeration oracle.
|
|
42
|
+
|
|
43
|
+
Operations: issueToken
|
|
44
|
+
Capability: identity/tokens
|
|
45
|
+
Realizes: identity/tokens#IDENTITY-ONE-REFUSAL
|
|
46
|
+
|
|
47
|
+
#### Scenario: A valid client credential is exchanged for a token
|
|
48
|
+
- **Given** a registered client whose secret has not been revoked
|
|
49
|
+
- **When** it posts its credentials to the token endpoint
|
|
50
|
+
- **Then** a token signed by the currently active key is returned
|
|
51
|
+
- **And** the response states the expiry the token was minted with
|
|
52
|
+
|
|
53
|
+
#### Scenario: An unknown client is refused
|
|
54
|
+
- **Given** a client id that was never registered
|
|
55
|
+
- **When** it posts credentials to the token endpoint
|
|
56
|
+
- **Then** the request is refused with 401 and no token is minted
|
|
57
|
+
- **And** the body says only that authentication failed
|
|
58
|
+
|
|
59
|
+
#### Scenario: A revoked secret is refused identically
|
|
60
|
+
- **Given** a registered client whose secret was revoked an hour ago
|
|
61
|
+
- **When** it posts its old credentials to the token endpoint
|
|
62
|
+
- **Then** the request is refused with 401
|
|
63
|
+
- **And** the response is byte-identical to the unknown-client refusal, so the two cases cannot be told apart from outside
|
|
64
|
+
|
|
65
|
+
### Requirement: Introspect a token
|
|
66
|
+
|
|
67
|
+
Requirement-ID: IDN-INTROSPECT
|
|
68
|
+
The service SHALL report, for any token a caller presents, whether it is active now
|
|
69
|
+
and what it grants — computed from revocation state, never from the token's signature
|
|
70
|
+
alone, which stays valid for the whole of a revoked token's remaining lifetime. Only
|
|
71
|
+
callers holding `service/tokens:introspect` SHALL be answered: an introspection
|
|
72
|
+
endpoint open to anything on the network is a token-validity oracle for stolen
|
|
73
|
+
tokens.
|
|
74
|
+
|
|
75
|
+
Operations: introspectToken
|
|
76
|
+
Requires: service/tokens:introspect
|
|
77
|
+
Capability: identity/tokens
|
|
78
|
+
Realizes: identity/tokens#IDENTITY-REVOKE-EVERYWHERE
|
|
79
|
+
|
|
80
|
+
#### Scenario: An active token is described to its caller
|
|
81
|
+
- **Given** a token issued eight minutes ago with a thirty-minute lifetime
|
|
82
|
+
- **When** order-service introspects it
|
|
83
|
+
- **Then** the verdict is active, with the client it was issued to and the scopes it carries
|
|
84
|
+
|
|
85
|
+
#### Scenario: A revoked token reads inactive while its signature still verifies
|
|
86
|
+
- **Given** a token whose client was revoked after issuance
|
|
87
|
+
- **When** the token is introspected
|
|
88
|
+
- **Then** the verdict is inactive
|
|
89
|
+
- **And** no subject or scope is disclosed for it
|
|
90
|
+
|
|
91
|
+
#### Scenario: A caller without the introspection permission is told nothing
|
|
92
|
+
- **Given** a caller whose own token does not hold `service/tokens:introspect`
|
|
93
|
+
- **When** it introspects somebody else's token
|
|
94
|
+
- **Then** the request is refused before any verdict is computed
|
|
95
|
+
- **And** the refusal is the same whether or not the presented token exists, so a caller cannot use the refusal itself to test tokens
|
|
96
|
+
|
|
97
|
+
### Requirement: Answer legacy token validation
|
|
98
|
+
|
|
99
|
+
Requirement-ID: IDN-VALIDATE-LEGACY
|
|
100
|
+
`validateToken` is superseded by `introspectToken` and is kept alive for exactly one
|
|
101
|
+
reason: payment-service still calls it, and the fleet map says so with an op-linked
|
|
102
|
+
edge. Until that consumer migrates, the service SHALL answer the legacy endpoint with
|
|
103
|
+
the same verdict introspection would give — never a cheaper local signature check —
|
|
104
|
+
and SHALL NOT extend it: no new caller, no new field, no new status code. The
|
|
105
|
+
endpoint is retired by a feature delta that removes the operation and this
|
|
106
|
+
requirement together, not by quietly deleting either.
|
|
107
|
+
|
|
108
|
+
Operations: validateToken
|
|
109
|
+
|
|
110
|
+
#### Scenario: The legacy verdict agrees with introspection
|
|
111
|
+
- **Given** a token that introspection reports as active
|
|
112
|
+
- **When** the same token is checked through the legacy endpoint
|
|
113
|
+
- **Then** it is reported valid, with the same expiry introspection gave
|
|
114
|
+
|
|
115
|
+
#### Scenario: A revoked token is not reported valid by the legacy path
|
|
116
|
+
- **Given** a token whose client was revoked after issuance
|
|
117
|
+
- **When** the legacy endpoint is asked about it
|
|
118
|
+
- **Then** it is reported invalid
|
|
119
|
+
- **And** the answer came from revocation state, not from the token's signature
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
# The async contract — read-only. Every operation here carries `action: receive`:
|
|
2
|
+
# this service produces no message and exposes no HTTP operation, so the whole of
|
|
3
|
+
# what it promises the fleet is what it does with three topics.
|
|
4
|
+
#
|
|
5
|
+
# AsyncAPI 3.0 only. Its operations are named top-level objects carrying
|
|
6
|
+
# `action: send|receive`, which is what makes a message's direction legible;
|
|
7
|
+
# 2.x spells the same thing as publish/subscribe under a channel, where the two
|
|
8
|
+
# words are ambiguous about whose perspective they take — and a 2.x document
|
|
9
|
+
# is refused as one `asyncapi.invalid` naming its version, with nothing graded
|
|
10
|
+
# against it (`asyncapi convert --target-version=3.0.0` upgrades it).
|
|
11
|
+
#
|
|
12
|
+
# The name is the spine: the landscape edge's `metadata { consumes }`, the
|
|
13
|
+
# requirement's `Consumes:` line and `name` below are one name spelled three
|
|
14
|
+
# times, and they must be identical. For a consumer the line that grades THIS
|
|
15
|
+
# file is the requirement's — a `Consumes:` naming a message no operation here
|
|
16
|
+
# receives is `spec-event.message-undefined`. The edge's copy answers the other
|
|
17
|
+
# question, the one no single repository can: whether anybody publishes the
|
|
18
|
+
# name at all. Deleting a `Consumes:` line therefore does not move a check onto
|
|
19
|
+
# the landscape, it removes one.
|
|
20
|
+
#
|
|
21
|
+
# WHY THE PAYLOADS ARE HERE AT ALL, and why one of them is different in kind:
|
|
22
|
+
#
|
|
23
|
+
# * `order.OrderPlaced` and `payment.PaymentCaptured` are produced INSIDE the
|
|
24
|
+
# fleet, so order-service's and payment-service's own asyncapi.yaml are the
|
|
25
|
+
# authoritative contracts. What is restated below is the subset this consumer
|
|
26
|
+
# actually reads — enough that the handler is codeable from this file, not a
|
|
27
|
+
# second source of truth for the event.
|
|
28
|
+
#
|
|
29
|
+
# * `crm.CustomerUpdated` is produced by `salesforce`, an `#external` element in
|
|
30
|
+
# the landscape. There is no services/salesforce/, there never will be, and so
|
|
31
|
+
# no producer contract exists anywhere in this docs repo. That is a legal
|
|
32
|
+
# shape — loam recognizes an external producer and does not report
|
|
33
|
+
# `spine.message-unproduced` — but it shifts the contract question onto the
|
|
34
|
+
# only file that can answer it: this one. `spine.message-external` (warn)
|
|
35
|
+
# fires for exactly as long as this document defines no shape for the message,
|
|
36
|
+
# and stops the moment it does. The payload below is therefore not a
|
|
37
|
+
# convenience copy; it IS the fleet's contract for that message, and the
|
|
38
|
+
# reason the finding is absent from this service's validate output.
|
|
39
|
+
asyncapi: 3.0.0
|
|
40
|
+
info:
|
|
41
|
+
title: notification-service events
|
|
42
|
+
version: "1.0"
|
|
43
|
+
|
|
44
|
+
channels:
|
|
45
|
+
orderEvents:
|
|
46
|
+
address: order.events.v1
|
|
47
|
+
description: Order lifecycle events, produced by order-service
|
|
48
|
+
messages:
|
|
49
|
+
OrderPlaced:
|
|
50
|
+
$ref: '#/components/messages/OrderPlaced'
|
|
51
|
+
paymentEvents:
|
|
52
|
+
address: payment.events.v1
|
|
53
|
+
description: Payment lifecycle events, produced by payment-service's outbox relay
|
|
54
|
+
messages:
|
|
55
|
+
PaymentCaptured:
|
|
56
|
+
$ref: "#/components/messages/PaymentCaptured"
|
|
57
|
+
PaymentRefunded:
|
|
58
|
+
$ref: "#/components/messages/PaymentRefunded"
|
|
59
|
+
crmEvents:
|
|
60
|
+
address: crm.events.v1
|
|
61
|
+
description: Customer master-data events, produced by salesforce (outside the fleet)
|
|
62
|
+
messages:
|
|
63
|
+
CustomerUpdated:
|
|
64
|
+
$ref: '#/components/messages/CustomerUpdated'
|
|
65
|
+
|
|
66
|
+
# One operation per message rather than one per channel, so that adding a second
|
|
67
|
+
# message to a topic later is an addition here instead of a silent widening: an
|
|
68
|
+
# operation that lists no messages applies to EVERY message of its channel, and
|
|
69
|
+
# would start receiving contracts nobody read.
|
|
70
|
+
operations:
|
|
71
|
+
receiveOrderPlaced:
|
|
72
|
+
action: receive
|
|
73
|
+
channel:
|
|
74
|
+
$ref: '#/channels/orderEvents'
|
|
75
|
+
messages:
|
|
76
|
+
- $ref: '#/channels/orderEvents/messages/OrderPlaced'
|
|
77
|
+
receivePaymentCaptured:
|
|
78
|
+
action: receive
|
|
79
|
+
channel:
|
|
80
|
+
$ref: '#/channels/paymentEvents'
|
|
81
|
+
messages:
|
|
82
|
+
- $ref: '#/channels/paymentEvents/messages/PaymentCaptured'
|
|
83
|
+
receiveCustomerUpdated:
|
|
84
|
+
action: receive
|
|
85
|
+
channel:
|
|
86
|
+
$ref: '#/channels/crmEvents'
|
|
87
|
+
messages:
|
|
88
|
+
- $ref: '#/channels/crmEvents/messages/CustomerUpdated'
|
|
89
|
+
receivePaymentRefunded:
|
|
90
|
+
action: receive
|
|
91
|
+
channel:
|
|
92
|
+
$ref: "#/channels/paymentEvents"
|
|
93
|
+
messages:
|
|
94
|
+
- $ref: "#/channels/paymentEvents/messages/PaymentRefunded"
|
|
95
|
+
|
|
96
|
+
components:
|
|
97
|
+
messages:
|
|
98
|
+
OrderPlaced:
|
|
99
|
+
# Namespaced by the domain that OWNS the message, never by the service
|
|
100
|
+
# reading it: `order.` says order-service is the one producer, and two
|
|
101
|
+
# services declaring they send this name would be
|
|
102
|
+
# `asyncapi.message-contested` — which contract a consumer reads must not
|
|
103
|
+
# be a coin flip.
|
|
104
|
+
name: order.OrderPlaced
|
|
105
|
+
title: Order placed
|
|
106
|
+
payload:
|
|
107
|
+
type: object
|
|
108
|
+
# A payload declaring no shape — absent, or a bare `type: object` — is
|
|
109
|
+
# `asyncapi.payload-undescribed`: the name joins the spine while nothing
|
|
110
|
+
# says what a handler would read. loam probes for presence and never
|
|
111
|
+
# reads a field, which is what keeps a later move to Avro a
|
|
112
|
+
# `schemaFormat:` line here and no change in loam.
|
|
113
|
+
required: [ orderId, customerId, placedAt ]
|
|
114
|
+
properties:
|
|
115
|
+
orderId:
|
|
116
|
+
type: string
|
|
117
|
+
format: uuid
|
|
118
|
+
description: The idempotency key for the confirmation — one send per orderId
|
|
119
|
+
customerId:
|
|
120
|
+
type: string
|
|
121
|
+
format: uuid
|
|
122
|
+
placedAt:
|
|
123
|
+
type: string
|
|
124
|
+
format: date-time
|
|
125
|
+
PaymentCaptured:
|
|
126
|
+
name: payment.PaymentCaptured
|
|
127
|
+
title: Payment captured
|
|
128
|
+
payload:
|
|
129
|
+
type: object
|
|
130
|
+
required: [ paymentId, orderId, capturedAmount, currency, capturedAt ]
|
|
131
|
+
properties:
|
|
132
|
+
paymentId:
|
|
133
|
+
type: string
|
|
134
|
+
format: uuid
|
|
135
|
+
orderId:
|
|
136
|
+
type: string
|
|
137
|
+
format: uuid
|
|
138
|
+
description: What joins a receipt to the order the customer was told about
|
|
139
|
+
capturedAmount:
|
|
140
|
+
type: integer
|
|
141
|
+
description: minor units, restated on the receipt exactly as captured
|
|
142
|
+
currency:
|
|
143
|
+
type: string
|
|
144
|
+
pattern: '^[A-Z]{3}$'
|
|
145
|
+
capturedAt:
|
|
146
|
+
type: string
|
|
147
|
+
format: date-time
|
|
148
|
+
CustomerUpdated:
|
|
149
|
+
name: crm.CustomerUpdated
|
|
150
|
+
title: Customer contact details updated
|
|
151
|
+
payload:
|
|
152
|
+
type: object
|
|
153
|
+
# `version` is load-bearing rather than descriptive: the CRM redelivers
|
|
154
|
+
# and reorders, and the "out-of-order update is ignored" scenario in
|
|
155
|
+
# spec.md is only implementable because this field is in the contract.
|
|
156
|
+
# Nothing outside this document defines it.
|
|
157
|
+
required: [ customerId, version, updatedAt ]
|
|
158
|
+
properties:
|
|
159
|
+
customerId:
|
|
160
|
+
type: string
|
|
161
|
+
format: uuid
|
|
162
|
+
version:
|
|
163
|
+
type: integer
|
|
164
|
+
description: Monotonic per customer; an update at or below the stored version is
|
|
165
|
+
dropped
|
|
166
|
+
email:
|
|
167
|
+
type: string
|
|
168
|
+
format: email
|
|
169
|
+
phone:
|
|
170
|
+
type: string
|
|
171
|
+
description: E.164; absent when the customer has no phone on record
|
|
172
|
+
updatedAt:
|
|
173
|
+
type: string
|
|
174
|
+
format: date-time
|
|
175
|
+
PaymentRefunded:
|
|
176
|
+
name: payment.PaymentRefunded
|
|
177
|
+
title: Payment refunded
|
|
178
|
+
payload:
|
|
179
|
+
type: object
|
|
180
|
+
required:
|
|
181
|
+
- paymentId
|
|
182
|
+
- orderId
|
|
183
|
+
- refundedAmount
|
|
184
|
+
- currency
|
|
185
|
+
- refundedAt
|
|
186
|
+
properties:
|
|
187
|
+
paymentId:
|
|
188
|
+
type: string
|
|
189
|
+
format: uuid
|
|
190
|
+
orderId:
|
|
191
|
+
type: string
|
|
192
|
+
refundedAmount:
|
|
193
|
+
type: integer
|
|
194
|
+
description: minor units
|
|
195
|
+
currency:
|
|
196
|
+
type: string
|
|
197
|
+
pattern: ^[A-Z]{3}$
|
|
198
|
+
refundedAt:
|
|
199
|
+
type: string
|
|
200
|
+
format: date-time
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Service health model. Targets are authored; the dependency graph comes from C4
|
|
2
|
+
# — this service's own model.likec4, which carries everything the service touches.
|
|
3
|
+
# planned: `loam health` composes these across the fleet -> cascade / blast-radius.
|
|
4
|
+
#
|
|
5
|
+
# `loam validate` reads only ids out of this file: the `name` of each SLI and
|
|
6
|
+
# alert, and each dependency's `service:` id.
|
|
7
|
+
#
|
|
8
|
+
# THERE ARE NO `slis:` AND NO `alerts:` HERE, and the absence is the point of this
|
|
9
|
+
# example. `health.uncovered` asks that every declared signal be named by a
|
|
10
|
+
# `Covers: sli:<id>` / `Covers: alert:<id>` line in the service's living
|
|
11
|
+
# arch.spec.md — so declaring nothing is what makes an arch.spec.md genuinely not
|
|
12
|
+
# owed, and the check has nothing to fire on rather than being suppressed. The
|
|
13
|
+
# honest reading of this file today is "nobody has written this service's SLOs
|
|
14
|
+
# yet": consumer lag and provider failure rate are the two obvious ones, and the
|
|
15
|
+
# day either is declared here it also owes an arch requirement covering it. An
|
|
16
|
+
# absent file would say the same thing more quietly and lose the `checks:` and
|
|
17
|
+
# `dependencies:` below, which on-call reads first.
|
|
18
|
+
service: notification-service
|
|
19
|
+
status: draft
|
|
20
|
+
# Probes, not fleet operations: they carry no operationId, no requirement governs
|
|
21
|
+
# them and no service calls them, which is exactly why they live here and not in
|
|
22
|
+
# an openapi.yaml this service does not owe. Nothing below is read by any check —
|
|
23
|
+
# `checks:` is authored prose for whoever is holding the pager.
|
|
24
|
+
checks:
|
|
25
|
+
liveness: GET /internal/health/liveness
|
|
26
|
+
readiness: GET /internal/health/readiness # consumer group joined + both stores reachable
|
|
27
|
+
dependencies:
|
|
28
|
+
# Resolved against services/platform/notification-service/model.likec4 — this
|
|
29
|
+
# service's own model, never the fleet map read on its own
|
|
30
|
+
# (`health.dependency-unmodelled` when nothing there answers to the name).
|
|
31
|
+
# That model EXTENDS the map, so what answers is its own slice: the elements
|
|
32
|
+
# it adds, plus the partners it points at and their ancestors. `kafka` below
|
|
33
|
+
# resolves through the second half — the edges name `kafka.orderEvents` and
|
|
34
|
+
# the broker that owns the topic comes with it.
|
|
35
|
+
# The delivery log and the contact store are absent on purpose: both
|
|
36
|
+
# are nested inside the service element and share its lifecycle, so they are
|
|
37
|
+
# blast radius rather than dependency — identity-service's health.yaml states
|
|
38
|
+
# the same rule for its two stores.
|
|
39
|
+
- service: kafka
|
|
40
|
+
criticality: critical # no broker -> no events -> nothing to notify anyone about
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
// notification-service's own C4 — what is INSIDE the element the fleet map binds
|
|
2
|
+
// to services/platform/notification-service/. Written by an agent from the
|
|
3
|
+
// `loam adopt` brief, then curated.
|
|
4
|
+
//
|
|
5
|
+
// An EXTENDING model: no `specification` block, no partner copies. The topics
|
|
6
|
+
// this service consumes — `kafka.orderEvents`, `kafka.paymentEvents`,
|
|
7
|
+
// `kafka.crmEvents` — are the MAP's, declared there once with the `topic` kind
|
|
8
|
+
// that carries `#external` and `#platform`; this file points at them. So is
|
|
9
|
+
// `notificationProvider`, the third-party gateway: a system this service reaches
|
|
10
|
+
// belongs in architecture/landscape.likec4, and declaring a copy of it here
|
|
11
|
+
// would be `c4.element-unowned`. `extend` takes the fully-qualified id because
|
|
12
|
+
// the element is nested in the `marketplace` group.
|
|
13
|
+
//
|
|
14
|
+
// SCHEMA.md, "Two shapes of a service model", has the standalone shape — a model
|
|
15
|
+
// that declares its own `specification` and is therefore parsed alone — and the
|
|
16
|
+
// ordered recipe for migrating one to this shape.
|
|
17
|
+
model {
|
|
18
|
+
extend marketplace.notificationService {
|
|
19
|
+
consumer = container 'consumer' {
|
|
20
|
+
description 'Kafka consumer group; one handler per message name'
|
|
21
|
+
technology 'Go'
|
|
22
|
+
}
|
|
23
|
+
sender = container 'sender' {
|
|
24
|
+
description 'Renders a template and hands it to the email/SMS provider'
|
|
25
|
+
technology 'Go'
|
|
26
|
+
}
|
|
27
|
+
// Both stores are nested INSIDE the service and neither is drawn beside it
|
|
28
|
+
// in the landscape — the example's choice, and one loam does not grade
|
|
29
|
+
// either way. Neither appears in health.yaml's dependencies either: they
|
|
30
|
+
// share this service's lifecycle rather than being something it reaches
|
|
31
|
+
// across a boundary, and that is the fact the nesting is drawn from.
|
|
32
|
+
deliveryLog = database 'delivery-log' {
|
|
33
|
+
description 'One row per (message id, channel) — the idempotency key that makes redelivery a no-op — carrying the orderId and customer each send was addressed to, so a receipt can find its order and a capture that arrives first has somewhere to wait'
|
|
34
|
+
technology 'PostgreSQL'
|
|
35
|
+
}
|
|
36
|
+
// The state NTF-CONTACT is entirely about, and it cannot be a corner of the
|
|
37
|
+
// delivery log: that table is keyed by message and holds nothing per
|
|
38
|
+
// customer, so it has no place to put a `version` to compare an update
|
|
39
|
+
// against. Without this element the spec promises a versioned copy of every
|
|
40
|
+
// customer address that the model gives nowhere to live — a divergence no
|
|
41
|
+
// loam check catches, because loam grades that health.yaml's dependencies
|
|
42
|
+
// resolve here and never that the requirements do.
|
|
43
|
+
contacts = database 'contacts' {
|
|
44
|
+
description 'The copy of each customer email and phone this service sends to, with the CRM version that decides whether an arriving update is newer'
|
|
45
|
+
technology 'PostgreSQL'
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
consumer -> deliveryLog 'Claims a delivery before sending'
|
|
49
|
+
consumer -> contacts 'Applies a CRM update only when its version is newer'
|
|
50
|
+
consumer -> sender 'Hands off a rendered notification'
|
|
51
|
+
sender -> contacts 'Reads the address a notification goes to'
|
|
52
|
+
sender -> deliveryLog 'Records delivered / failed'
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// The three channels this service takes messages off, pointing at the map's
|
|
56
|
+
// topics. health.yaml names `kafka` as a critical dependency and that id has to
|
|
57
|
+
// resolve through this model (`health.dependency-unmodelled` otherwise): it
|
|
58
|
+
// does, because a partner brings its ANCESTORS with it — the edges name the
|
|
59
|
+
// topics and the broker answers for them.
|
|
60
|
+
//
|
|
61
|
+
// No `metadata { consumes }` on these edges, and adding it would change
|
|
62
|
+
// nothing: loam reads the event spine off `architecture/landscape.likec4`
|
|
63
|
+
// alone, never off a service model. What resolves a consumed name against
|
|
64
|
+
// asyncapi.yaml is each requirement's `Consumes:` line
|
|
65
|
+
// (`spec-event.message-undefined` when one names a message no `action:
|
|
66
|
+
// receive` operation declares); what the landscape settles is the other
|
|
67
|
+
// half — that somebody, inside the fleet or tagged #external, publishes it.
|
|
68
|
+
// These three edges are here for the picture only, and they earn it: this
|
|
69
|
+
// model, the three channels in asyncapi.yaml and the three topics the runbook
|
|
70
|
+
// names agree, or one of the three is out of date.
|
|
71
|
+
// Drawn topic → consumer, the direction the landscape uses and the one the
|
|
72
|
+
// event spine requires there: `consumes` binds the edge's TARGET, so the same
|
|
73
|
+
// edge drawn the other way round binds to nothing at all.
|
|
74
|
+
kafka.orderEvents -> marketplace.notificationService.consumer 'OrderPlaced triggers the confirmation'
|
|
75
|
+
kafka.paymentEvents -> marketplace.notificationService.consumer 'PaymentCaptured triggers the receipt'
|
|
76
|
+
kafka.crmEvents -> marketplace.notificationService.consumer 'CustomerUpdated refreshes contact details'
|
|
77
|
+
|
|
78
|
+
// The second thing this service reaches across its own boundary, and the one
|
|
79
|
+
// the runbook spends an incident section on: while the provider is down or
|
|
80
|
+
// throttling, nothing is delivered and there is no fallback path. Its element
|
|
81
|
+
// is the map's, and the map also carries the SERVICE-level twin of this edge
|
|
82
|
+
// (`marketplace.notificationService -> notificationProvider`), because every
|
|
83
|
+
// fleet check reads the map alone. The cross-boundary call is written twice on
|
|
84
|
+
// purpose — container-level here, service-level there — and that remainder is
|
|
85
|
+
// recorded in ROADMAP.md rather than hidden.
|
|
86
|
+
marketplace.notificationService.sender -> notificationProvider 'Sends email and SMS, and backs off on 429'
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Views belong to LikeC4's renderer; no loam check reads anything below. This
|
|
90
|
+
// file is part of the root project, so `npx likec4 start` at the docs root draws
|
|
91
|
+
// this view beside the fleet map — there is no per-service likec4.config.json,
|
|
92
|
+
// and loam never writes one beside an extending model.
|
|
93
|
+
views {
|
|
94
|
+
view notification_service of marketplace.notificationService {
|
|
95
|
+
include *
|
|
96
|
+
}
|
|
97
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
---
|
|
2
|
+
service: notification-service
|
|
3
|
+
status: draft
|
|
4
|
+
owner: growth-team
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# notification-service — runbook
|
|
8
|
+
|
|
9
|
+
A consumer-only worker: it serves no traffic, so nothing degrades when it stops — it falls
|
|
10
|
+
behind. Every incident below is a lag or a send failure, never a request error.
|
|
11
|
+
|
|
12
|
+
## Deploy
|
|
13
|
+
- Pipeline: `.gitlab-ci.yml` -> `deploy:prod` (manual gate).
|
|
14
|
+
- Config: `config/`; provider credentials via Vault path `secret/notification-service`.
|
|
15
|
+
- Rolling deploys rebalance the consumer group: expect a lag spike for the length of one
|
|
16
|
+
rebalance, and do not roll again until it has drained.
|
|
17
|
+
|
|
18
|
+
## Health
|
|
19
|
+
- Liveness: `GET /internal/health/liveness`
|
|
20
|
+
- Readiness: `GET /internal/health/readiness` (consumer group joined + both stores reachable)
|
|
21
|
+
- There are no SLOs yet — see the comment at the top of `health.yaml`.
|
|
22
|
+
|
|
23
|
+
## Common incidents
|
|
24
|
+
|
|
25
|
+
### Consumer lag on one topic
|
|
26
|
+
Symptom: notifications arrive late; `kafka_consumergroup_lag` climbs on `order.events.v1`,
|
|
27
|
+
`payment.events.v1` or `crm.events.v1`.
|
|
28
|
+
- Check which partition is behind — a single hot partition is a slow handler, all of them is
|
|
29
|
+
the provider (below) or the delivery log.
|
|
30
|
+
- Redelivery is safe on every topic, for two different reasons: `order.events.v1` and
|
|
31
|
+
`payment.events.v1` because the delivery log is keyed on `(message id, channel)` and a
|
|
32
|
+
replayed partition sends nothing twice, `crm.events.v1` because an update at or below the
|
|
33
|
+
`version` already in the contact store is dropped. Resetting an offset FORWARD is safe on
|
|
34
|
+
none of them — it drops confirmations nobody will re-emit.
|
|
35
|
+
|
|
36
|
+
### Provider throttling
|
|
37
|
+
Symptom: the sender's 429 rate rises and lag follows it on every topic at once.
|
|
38
|
+
- The sender backs off and retries; do not scale the consumer up, which only queues more
|
|
39
|
+
work behind the same provider quota.
|
|
40
|
+
- Confirm the quota with the provider before raising concurrency. Sending faster than the
|
|
41
|
+
quota converts throttling into hard rejections, and a rejected send is a customer who was
|
|
42
|
+
never told.
|
|
43
|
+
- A held receipt (a capture whose order has not arrived — `NTF-RECEIPT`) looks identical in
|
|
44
|
+
the lag graph. Check the held-receipt count before treating it as a provider problem.
|
|
45
|
+
|
|
46
|
+
## Escalation
|
|
47
|
+
On-call channel: `#growth-oncall`. Provider incidents escalate to the vendor's status page
|
|
48
|
+
first — this service has no way to deliver anything while the provider is down.
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
---
|
|
2
|
+
service: notification-service
|
|
3
|
+
status: draft
|
|
4
|
+
owner: growth-team
|
|
5
|
+
sources:
|
|
6
|
+
- internal/consumer/
|
|
7
|
+
- internal/sender/
|
|
8
|
+
- cmd/notifier/
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# notification-service
|
|
12
|
+
|
|
13
|
+
Turns fleet events into customer email and SMS. This is the **living spec** — the complete
|
|
14
|
+
current state; feature deltas merge in here on `loam archive`.
|
|
15
|
+
|
|
16
|
+
This service exposes **no HTTP API**: the liveness and readiness probes in `health.yaml` are the
|
|
17
|
+
only ports it listens on, and nothing in the fleet calls them. That is a documented shape rather
|
|
18
|
+
than a gap — no edge in the landscape carries `metadata { op }` into this service, so
|
|
19
|
+
`loam validate` stays silent about the missing `openapi.yaml` instead of warning. The silence is
|
|
20
|
+
earned rather than granted: it turns into a warning the moment the landscape stops proving
|
|
21
|
+
nobody calls this service — it goes missing, or it stops parsing — and into an error the moment
|
|
22
|
+
a requirement here grows an `Operations:` line or an op-linked edge points in. Every requirement
|
|
23
|
+
below therefore carries a `Consumes:` line and no `Operations:` line: what this service promises
|
|
24
|
+
is a reaction to a message, and the message name is the only join it has.
|
|
25
|
+
|
|
26
|
+
## Requirements
|
|
27
|
+
|
|
28
|
+
### Requirement: Notify a customer when an order is placed
|
|
29
|
+
|
|
30
|
+
Requirement-ID: NTF-ORDER-PLACED
|
|
31
|
+
The service SHALL send exactly one order-confirmation notification per order, addressed to the
|
|
32
|
+
contact details it holds for the customer at the moment the confirmation is rendered.
|
|
33
|
+
|
|
34
|
+
Consumes: order.OrderPlaced
|
|
35
|
+
Capability: order-notifications
|
|
36
|
+
|
|
37
|
+
#### Scenario: First delivery of an order event
|
|
38
|
+
- **Given** an `order.OrderPlaced` carrying an `orderId` this service has never sent a confirmation for
|
|
39
|
+
- **When** the consumer handles it
|
|
40
|
+
- **Then** a confirmation is rendered from the contact details on file and handed to the provider
|
|
41
|
+
- **And** the delivery log records the send under that `orderId`
|
|
42
|
+
|
|
43
|
+
#### Scenario: The broker redelivers an event already sent
|
|
44
|
+
- **Given** a confirmation already recorded in the delivery log for that `orderId`
|
|
45
|
+
- **When** kafka redelivers the same `order.OrderPlaced`
|
|
46
|
+
- **Then** no second notification is sent and the event is acknowledged
|
|
47
|
+
- **And** the customer is not told twice about one order
|
|
48
|
+
|
|
49
|
+
### Requirement: Send a receipt when a payment is captured
|
|
50
|
+
|
|
51
|
+
Requirement-ID: NTF-RECEIPT
|
|
52
|
+
The service SHALL send a receipt for every captured payment, stating the captured amount and
|
|
53
|
+
currency exactly as the capture reported them.
|
|
54
|
+
|
|
55
|
+
Consumes: payment.PaymentCaptured
|
|
56
|
+
Capability: order-notifications
|
|
57
|
+
|
|
58
|
+
#### Scenario: Receipt follows a capture
|
|
59
|
+
- **Given** a `payment.PaymentCaptured` for an order this service has already confirmed
|
|
60
|
+
- **When** the consumer handles it
|
|
61
|
+
- **Then** a receipt showing `capturedAmount` in `currency` is sent to the contact on file
|
|
62
|
+
|
|
63
|
+
#### Scenario: A capture arrives before the order it belongs to
|
|
64
|
+
- **Given** a `payment.PaymentCaptured` whose `orderId` this service has not yet seen on the order topic
|
|
65
|
+
- **When** the consumer handles it
|
|
66
|
+
- **Then** the receipt is held until the matching `order.OrderPlaced` arrives, and sent then
|
|
67
|
+
- **And** no receipt is sent for an order the customer has not been told exists
|
|
68
|
+
|
|
69
|
+
### Requirement: Keep contact details current
|
|
70
|
+
|
|
71
|
+
Requirement-ID: NTF-CONTACT
|
|
72
|
+
The service SHALL keep its copy of a customer's email and phone in step with the CRM, applying
|
|
73
|
+
an update only when it is newer than the copy already held.
|
|
74
|
+
|
|
75
|
+
Consumes: crm.CustomerUpdated
|
|
76
|
+
|
|
77
|
+
#### Scenario: A newer update replaces the copy on file
|
|
78
|
+
- **Given** contact details held at `version` 4 for a customer
|
|
79
|
+
- **When** a `crm.CustomerUpdated` for that customer arrives at `version` 5
|
|
80
|
+
- **Then** the stored email and phone are replaced with the ones the event carries
|
|
81
|
+
|
|
82
|
+
#### Scenario: An out-of-order update is ignored
|
|
83
|
+
- **Given** contact details held at `version` 5 for a customer
|
|
84
|
+
- **When** a `crm.CustomerUpdated` for that customer arrives at `version` 4
|
|
85
|
+
- **Then** the stored details are left as they are
|
|
86
|
+
- **And** the next notification still goes to the newer address
|
|
87
|
+
|
|
88
|
+
#### Scenario: A customer this service has never notified
|
|
89
|
+
- **Given** a `crm.CustomerUpdated` for a `customerId` with no contact details on file
|
|
90
|
+
- **When** the consumer handles it
|
|
91
|
+
- **Then** the details are stored, so the first notification for that customer is addressable
|
|
92
|
+
|
|
93
|
+
### Requirement: Notify a customer when a refund completes
|
|
94
|
+
|
|
95
|
+
Requirement-ID: NTF-REFUND
|
|
96
|
+
The service SHALL send exactly one refund notification per refunded payment, stating the
|
|
97
|
+
refunded amount and currency exactly as the refund reported them, and SHALL NOT send one
|
|
98
|
+
until the refund is complete.
|
|
99
|
+
|
|
100
|
+
Consumes: payment.PaymentRefunded
|
|
101
|
+
Capability: order-notifications
|
|
102
|
+
|
|
103
|
+
#### Scenario: A completed refund is announced once
|
|
104
|
+
- **Given** a `payment.PaymentRefunded` for an order this service has already confirmed
|
|
105
|
+
- **When** the consumer handles it
|
|
106
|
+
- **Then** a refund notification is rendered with the refunded amount and currency
|
|
107
|
+
- **And** the delivery log records the send under that `paymentId`
|
|
108
|
+
|
|
109
|
+
#### Scenario: The broker redelivers a refund already announced
|
|
110
|
+
- **Given** a refund notification already recorded in the delivery log for that `paymentId`
|
|
111
|
+
- **When** kafka redelivers the same `payment.PaymentRefunded`
|
|
112
|
+
- **Then** no second notification is sent and the event is acknowledged
|