@ybotok/loam 0.2.0-alpha.1 → 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 +3448 -0
- package/COMPARISON.md +91 -3
- package/CONTRIBUTING.md +37 -0
- package/MIGRATING-from-OpenSpec.md +47 -23
- package/QUICKSTART.md +189 -12
- package/README.md +274 -65
- package/ROADMAP.md +572 -31
- package/SCHEMA.md +1709 -155
- package/WORKFLOW.md +298 -72
- package/dist/cli.js +26 -8
- package/dist/cli.js.map +1 -1
- package/dist/commands/adopt/adopt.js +5 -10
- package/dist/commands/adopt/adopt.js.map +1 -1
- package/dist/commands/adopt/render.js +50 -9
- package/dist/commands/adopt/render.js.map +1 -1
- package/dist/commands/archive/archive.js +16 -19
- package/dist/commands/archive/archive.js.map +1 -1
- 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 +36 -42
- package/dist/commands/archive/plan/contracts/asyncapi.js.map +1 -1
- 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 +77 -43
- package/dist/commands/archive/plan/contracts/openapi.js.map +1 -1
- 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 +21 -19
- package/dist/commands/archive/plan/gate.js.map +1 -1
- package/dist/commands/archive/plan/landscape.js +167 -30
- package/dist/commands/archive/plan/landscape.js.map +1 -1
- 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 +14 -19
- package/dist/commands/archive/plan/refusal.js.map +1 -1
- package/dist/commands/archive/plan/specs.js +137 -56
- package/dist/commands/archive/plan/specs.js.map +1 -1
- package/dist/commands/archive/plan/state.js +3 -0
- package/dist/commands/archive/plan/state.js.map +1 -1
- package/dist/commands/archive/run.js +134 -30
- package/dist/commands/archive/run.js.map +1 -1
- package/dist/commands/archive/shipped.js +49 -0
- package/dist/commands/archive/shipped.js.map +1 -0
- package/dist/commands/context/context.js +85 -18
- package/dist/commands/context/context.js.map +1 -1
- package/dist/commands/context/print.js +29 -7
- package/dist/commands/context/print.js.map +1 -1
- package/dist/commands/delta/delta.js +102 -14
- package/dist/commands/delta/delta.js.map +1 -1
- package/dist/commands/delta/print.js +17 -1
- package/dist/commands/delta/print.js.map +1 -1
- package/dist/commands/dependencies.js +3 -7
- package/dist/commands/dependencies.js.map +1 -1
- package/dist/commands/diff/diff.js +20 -27
- package/dist/commands/diff/diff.js.map +1 -1
- package/dist/commands/doctor.js +60 -1
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/explain/explain.js +89 -13
- package/dist/commands/explain/explain.js.map +1 -1
- package/dist/commands/explore.js +16 -10
- package/dist/commands/explore.js.map +1 -1
- package/dist/commands/gate/gate.js +45 -8
- package/dist/commands/gate/gate.js.map +1 -1
- package/dist/commands/gate/print.js +15 -3
- package/dist/commands/gate/print.js.map +1 -1
- package/dist/commands/gherkin/commit.js +13 -54
- package/dist/commands/gherkin/commit.js.map +1 -1
- package/dist/commands/gherkin/gherkin.js +36 -20
- package/dist/commands/gherkin/gherkin.js.map +1 -1
- package/dist/commands/gherkin/reconcile.js +10 -13
- package/dist/commands/gherkin/reconcile.js.map +1 -1
- package/dist/commands/init/first-hour.js +44 -0
- package/dist/commands/init/first-hour.js.map +1 -1
- package/dist/commands/init/init.js +18 -22
- package/dist/commands/init/init.js.map +1 -1
- package/dist/commands/list/campaign/campaign.js +4 -6
- package/dist/commands/list/campaign/campaign.js.map +1 -1
- package/dist/commands/list/json.js +5 -7
- package/dist/commands/list/json.js.map +1 -1
- package/dist/commands/list/list.js +44 -29
- package/dist/commands/list/list.js.map +1 -1
- package/dist/commands/list/print.js +52 -9
- package/dist/commands/list/print.js.map +1 -1
- 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 +37 -34
- package/dist/commands/list/views.js.map +1 -1
- package/dist/commands/mcp/dispatch.js +91 -36
- package/dist/commands/mcp/dispatch.js.map +1 -1
- package/dist/commands/mcp/mcp.js +56 -15
- package/dist/commands/mcp/mcp.js.map +1 -1
- package/dist/commands/mcp/serve.js.map +1 -1
- package/dist/commands/migrate-openspec/materialize/active.js +27 -22
- package/dist/commands/migrate-openspec/materialize/active.js.map +1 -1
- package/dist/commands/migrate-openspec/materialize/stage.js +4 -3
- package/dist/commands/migrate-openspec/materialize/stage.js.map +1 -1
- package/dist/commands/migrate-openspec/materialize/target.js +2 -2
- package/dist/commands/migrate-openspec/materialize/target.js.map +1 -1
- package/dist/commands/migrate-openspec/openspec/decisions.js +9 -14
- package/dist/commands/migrate-openspec/openspec/decisions.js.map +1 -1
- package/dist/commands/migrate-openspec/openspec/error.js +7 -8
- package/dist/commands/migrate-openspec/openspec/error.js.map +1 -1
- package/dist/commands/migrate-openspec/openspec/mapping.js +1 -9
- package/dist/commands/migrate-openspec/openspec/mapping.js.map +1 -1
- package/dist/commands/migrate-openspec/openspec/paths.js +3 -6
- package/dist/commands/migrate-openspec/openspec/paths.js.map +1 -1
- 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 +8 -22
- package/dist/commands/new/commit.js.map +1 -1
- package/dist/commands/new/modifies.js +206 -0
- package/dist/commands/new/modifies.js.map +1 -0
- package/dist/commands/new/new.js +59 -14
- package/dist/commands/new/new.js.map +1 -1
- package/dist/commands/new/templates.js +48 -124
- package/dist/commands/new/templates.js.map +1 -1
- package/dist/commands/open.js +3 -7
- package/dist/commands/open.js.map +1 -1
- package/dist/commands/policy/gate.js +27 -0
- package/dist/commands/policy/gate.js.map +1 -1
- package/dist/commands/rebase/plan.js +2 -2
- package/dist/commands/rebase/plan.js.map +1 -1
- package/dist/commands/rebase/rebase.js +60 -35
- package/dist/commands/rebase/rebase.js.map +1 -1
- package/dist/commands/seed/commit.js +55 -26
- package/dist/commands/seed/commit.js.map +1 -1
- package/dist/commands/seed/plan.js +158 -13
- package/dist/commands/seed/plan.js.map +1 -1
- package/dist/commands/seed/seed.js +13 -11
- package/dist/commands/seed/seed.js.map +1 -1
- package/dist/commands/show/feature.js +9 -5
- package/dist/commands/show/feature.js.map +1 -1
- package/dist/commands/show/introduced.js +157 -0
- package/dist/commands/show/introduced.js.map +1 -0
- package/dist/commands/show/marks.js +35 -6
- package/dist/commands/show/marks.js.map +1 -1
- package/dist/commands/show/service.js +41 -33
- package/dist/commands/show/service.js.map +1 -1
- package/dist/commands/show/show.js +17 -7
- package/dist/commands/show/show.js.map +1 -1
- 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 +2 -0
- package/dist/commands/status/json.js.map +1 -1
- package/dist/commands/status/print.js +89 -37
- package/dist/commands/status/print.js.map +1 -1
- package/dist/commands/status/status.js +3 -7
- package/dist/commands/status/status.js.map +1 -1
- package/dist/commands/steps/steps.js +103 -23
- package/dist/commands/steps/steps.js.map +1 -1
- package/dist/commands/subsystem/edit.js +7 -7
- package/dist/commands/subsystem/edit.js.map +1 -1
- package/dist/commands/subsystem/move.js +106 -46
- package/dist/commands/subsystem/move.js.map +1 -1
- package/dist/commands/subsystem/query.js +2 -4
- package/dist/commands/subsystem/query.js.map +1 -1
- package/dist/commands/subsystem/subsystem.js +4 -7
- package/dist/commands/subsystem/subsystem.js.map +1 -1
- package/dist/commands/subsystem/sync.js +289 -74
- package/dist/commands/subsystem/sync.js.map +1 -1
- 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 +147 -45
- package/dist/commands/subsystem/txn/txn.js.map +1 -1
- package/dist/commands/subsystem/txn/views.js +200 -21
- package/dist/commands/subsystem/txn/views.js.map +1 -1
- 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 +42 -26
- package/dist/commands/unarchive/manifest.js.map +1 -1
- package/dist/commands/unarchive/restore.js +83 -33
- package/dist/commands/unarchive/restore.js.map +1 -1
- package/dist/commands/unarchive/unarchive.js +22 -30
- package/dist/commands/unarchive/unarchive.js.map +1 -1
- package/dist/commands/validate/arch-coverage.js +78 -27
- package/dist/commands/validate/arch-coverage.js.map +1 -1
- package/dist/commands/validate/checks/fleet-shape.js +34 -126
- package/dist/commands/validate/checks/fleet-shape.js.map +1 -1
- package/dist/commands/validate/checks/health-deps.js +9 -6
- package/dist/commands/validate/checks/health-deps.js.map +1 -1
- 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 +18 -8
- package/dist/commands/validate/checks/requirements.js.map +1 -1
- package/dist/commands/validate/checks/sources.js +11 -2
- package/dist/commands/validate/checks/sources.js.map +1 -1
- 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 +26 -20
- package/dist/commands/validate/feature.js.map +1 -1
- package/dist/commands/validate/fleet/census.js +37 -13
- package/dist/commands/validate/fleet/census.js.map +1 -1
- package/dist/commands/validate/fleet/landscape.js +144 -126
- package/dist/commands/validate/fleet/landscape.js.map +1 -1
- package/dist/commands/validate/fleet/load.js +66 -0
- package/dist/commands/validate/fleet/load.js.map +1 -1
- 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 +44 -14
- package/dist/commands/validate/fleet/obligations.js.map +1 -1
- package/dist/commands/validate/fleet/scorecard/print.js +10 -2
- package/dist/commands/validate/fleet/scorecard/print.js.map +1 -1
- package/dist/commands/validate/fleet/scorecard/scorecard.js +17 -11
- package/dist/commands/validate/fleet/scorecard/scorecard.js.map +1 -1
- package/dist/commands/validate/fleet/usecases/place.js.map +1 -1
- 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 +50 -15
- package/dist/commands/validate/fleet/views/ids.js.map +1 -1
- 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 +40 -47
- package/dist/commands/validate/fleet/views/stale.js.map +1 -1
- package/dist/commands/validate/links/corpus.js +1 -4
- package/dist/commands/validate/links/corpus.js.map +1 -1
- package/dist/commands/validate/links/glossary.js.map +1 -1
- 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 +36 -160
- package/dist/commands/validate/report.js.map +1 -1
- package/dist/commands/validate/scope.js +113 -0
- package/dist/commands/validate/scope.js.map +1 -0
- package/dist/commands/validate/service/api.js +21 -107
- package/dist/commands/validate/service/api.js.map +1 -1
- 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 +36 -14
- package/dist/commands/validate/service/events/events.js.map +1 -1
- package/dist/commands/validate/service/events/message-producers.js +1 -1
- package/dist/commands/validate/service/events/message-producers.js.map +1 -1
- package/dist/commands/validate/service/evidence-pins.js +56 -10
- package/dist/commands/validate/service/evidence-pins.js.map +1 -1
- 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 +121 -61
- package/dist/commands/validate/service/service.js.map +1 -1
- package/dist/commands/validate/service/specs.js +88 -28
- package/dist/commands/validate/service/specs.js.map +1 -1
- package/dist/commands/validate/service/spine.js +38 -3
- package/dist/commands/validate/service/spine.js.map +1 -1
- 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 +85 -60
- package/dist/commands/validate/validate.js.map +1 -1
- package/dist/commands/verify/cross/diff.js +2 -6
- package/dist/commands/verify/cross/diff.js.map +1 -1
- package/dist/commands/verify/evidence/contract.js +1 -1
- package/dist/commands/verify/evidence/contract.js.map +1 -1
- package/dist/commands/verify/evidence/read.js +12 -3
- package/dist/commands/verify/evidence/read.js.map +1 -1
- package/dist/commands/verify/frozen.js +45 -23
- package/dist/commands/verify/frozen.js.map +1 -1
- package/dist/commands/verify/record.js +69 -17
- package/dist/commands/verify/record.js.map +1 -1
- package/dist/commands/verify/report.js +27 -44
- package/dist/commands/verify/report.js.map +1 -1
- package/dist/commands/verify/results.js +112 -30
- package/dist/commands/verify/results.js.map +1 -1
- package/dist/commands/verify/verify.js +55 -52
- package/dist/commands/verify/verify.js.map +1 -1
- package/dist/commands/vouch/pack/pack.js +2 -2
- package/dist/commands/vouch/pack/pack.js.map +1 -1
- package/dist/commands/vouch/pack/print.js +1 -6
- package/dist/commands/vouch/pack/print.js.map +1 -1
- package/dist/commands/vouch/pack/sections.js +1 -2
- package/dist/commands/vouch/pack/sections.js.map +1 -1
- package/dist/commands/vouch/run.js +26 -81
- package/dist/commands/vouch/run.js.map +1 -1
- package/dist/commands/vouch/sample/plan.js +20 -34
- package/dist/commands/vouch/sample/plan.js.map +1 -1
- package/dist/commands/vouch/vet/verify.js +39 -7
- package/dist/commands/vouch/vet/verify.js.map +1 -1
- package/dist/commands/vouch/vouch.js +10 -17
- package/dist/commands/vouch/vouch.js.map +1 -1
- package/dist/core/agent/agents-md/command-map.js +81 -106
- package/dist/core/agent/agents-md/command-map.js.map +1 -1
- package/dist/core/agent/agents-md/map/explain.js +21 -9
- package/dist/core/agent/agents-md/map/explain.js.map +1 -1
- package/dist/core/agent/agents-md/map/lenses/context.js +17 -8
- package/dist/core/agent/agents-md/map/lenses/context.js.map +1 -1
- package/dist/core/agent/agents-md/map/lenses/diff.js +33 -20
- package/dist/core/agent/agents-md/map/lenses/diff.js.map +1 -1
- package/dist/core/agent/agents-md/map/lenses/gate.js +13 -5
- package/dist/core/agent/agents-md/map/lenses/gate.js.map +1 -1
- package/dist/core/agent/agents-md/map/mcp.js +10 -7
- package/dist/core/agent/agents-md/map/mcp.js.map +1 -1
- package/dist/core/agent/agents-md/map/status.js +24 -8
- package/dist/core/agent/agents-md/map/status.js.map +1 -1
- package/dist/core/agent/agents-md/map/subsystem.js +80 -8
- package/dist/core/agent/agents-md/map/subsystem.js.map +1 -1
- package/dist/core/agent/agents-md/map/usecases.js +88 -10
- package/dist/core/agent/agents-md/map/usecases.js.map +1 -1
- package/dist/core/agent/agents-md/refusals.js +49 -22
- package/dist/core/agent/agents-md/refusals.js.map +1 -1
- package/dist/core/agent/agents-md.js +39 -6
- package/dist/core/agent/agents-md.js.map +1 -1
- package/dist/core/agent/agents-stamp.js +10 -0
- package/dist/core/agent/agents-stamp.js.map +1 -1
- package/dist/core/agent/protocol.js +1 -1
- package/dist/core/agent/protocol.js.map +1 -1
- package/dist/core/agent/scaffold.js +10 -15
- package/dist/core/agent/scaffold.js.map +1 -1
- package/dist/core/agent/support/report.js +46 -5
- package/dist/core/agent/support/report.js.map +1 -1
- package/dist/core/agent/tools/dialects.js +1 -0
- package/dist/core/agent/tools/dialects.js.map +1 -1
- package/dist/core/agent/tools/registry.js +41 -76
- package/dist/core/agent/tools/registry.js.map +1 -1
- package/dist/core/agent/workflows/adopt.js +158 -11
- package/dist/core/agent/workflows/adopt.js.map +1 -1
- package/dist/core/agent/workflows/check.js +78 -39
- package/dist/core/agent/workflows/check.js.map +1 -1
- package/dist/core/agent/workflows/closing.js +88 -27
- package/dist/core/agent/workflows/closing.js.map +1 -1
- package/dist/core/agent/workflows/feature.js +128 -13
- package/dist/core/agent/workflows/feature.js.map +1 -1
- package/dist/core/agent/workflows/implement.js +96 -13
- package/dist/core/agent/workflows/implement.js.map +1 -1
- package/dist/core/agent/workflows/reference/authoring.js +106 -4
- package/dist/core/agent/workflows/reference/authoring.js.map +1 -1
- package/dist/core/agent/workflows/reference/codes.js +8 -6
- package/dist/core/agent/workflows/reference/codes.js.map +1 -1
- package/dist/core/agent/workflows/reference/done-check.js +37 -15
- package/dist/core/agent/workflows/reference/done-check.js.map +1 -1
- 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 +6 -3
- package/dist/core/agent/workflows/reference/reference.js.map +1 -1
- package/dist/core/agent/workflows/reference/spine.js +68 -27
- package/dist/core/agent/workflows/reference/spine.js.map +1 -1
- package/dist/core/asyncapi/baseline/plan.js +14 -81
- package/dist/core/asyncapi/baseline/plan.js.map +1 -1
- package/dist/core/asyncapi/digest.js +30 -25
- package/dist/core/asyncapi/digest.js.map +1 -1
- package/dist/core/asyncapi/merge/components.js +5 -4
- package/dist/core/asyncapi/merge/components.js.map +1 -1
- package/dist/core/asyncapi/merge/error.js +7 -2
- package/dist/core/asyncapi/merge/error.js.map +1 -1
- package/dist/core/asyncapi/merge/markers.js +32 -50
- package/dist/core/asyncapi/merge/markers.js.map +1 -1
- package/dist/core/asyncapi/merge/merge.js +33 -53
- package/dist/core/asyncapi/merge/merge.js.map +1 -1
- package/dist/core/asyncapi/merge/pin.js +12 -36
- package/dist/core/asyncapi/merge/pin.js.map +1 -1
- package/dist/core/asyncapi/model.js.map +1 -1
- package/dist/core/asyncapi/read.js +36 -12
- package/dist/core/asyncapi/read.js.map +1 -1
- package/dist/core/brief/brief.js +96 -36
- package/dist/core/brief/brief.js.map +1 -1
- package/dist/core/brief/checks.js +138 -3
- package/dist/core/brief/checks.js.map +1 -1
- package/dist/core/brief/landscape.js +209 -130
- package/dist/core/brief/landscape.js.map +1 -1
- 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 +109 -31
- package/dist/core/brief/targets.js.map +1 -1
- package/dist/core/brief/unchecked.js +14 -3
- package/dist/core/brief/unchecked.js.map +1 -1
- package/dist/core/c4/arch.js +90 -182
- package/dist/core/c4/arch.js.map +1 -1
- 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 +169 -14
- package/dist/core/c4/likec4.js.map +1 -1
- 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.map +1 -1
- package/dist/core/c4/parsed/values.js +54 -1
- package/dist/core/c4/parsed/values.js.map +1 -1
- package/dist/core/c4/parsed/view-ids.js +39 -1
- package/dist/core/c4/parsed/view-ids.js.map +1 -1
- 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 +123 -7
- package/dist/core/c4/project/architecture.js.map +1 -1
- 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 +43 -12
- package/dist/core/c4/project/documents.js.map +1 -1
- package/dist/core/c4/project/load.js +79 -43
- package/dist/core/c4/project/load.js.map +1 -1
- 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 +78 -17
- package/dist/core/c4/resolve/service.js.map +1 -1
- 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/template.js +65 -1
- package/dist/core/c4/seed/template.js.map +1 -1
- 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 +297 -10
- package/dist/core/c4/source-mask.js.map +1 -1
- package/dist/core/c4/source-scan.js +222 -141
- package/dist/core/c4/source-scan.js.map +1 -1
- package/dist/core/c4/splice/authored-source.js +79 -13
- package/dist/core/c4/splice/authored-source.js.map +1 -1
- package/dist/core/c4/splice/contract.js +20 -0
- package/dist/core/c4/splice/contract.js.map +1 -1
- package/dist/core/c4/splice/delta-blocks.js +20 -20
- package/dist/core/c4/splice/delta-blocks.js.map +1 -1
- 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 +37 -0
- package/dist/core/c4/splice/identity/edges.js.map +1 -1
- 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 +182 -114
- package/dist/core/c4/splice/landscape-merge.js.map +1 -1
- 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 +160 -56
- package/dist/core/c4/splice/placement.js.map +1 -1
- 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 +13 -19
- package/dist/core/c4/workspace.js.map +1 -1
- package/dist/core/capabilities/capabilities.js +6 -6
- package/dist/core/capabilities/capabilities.js.map +1 -1
- package/dist/core/capabilities/delta/doc.js +7 -10
- package/dist/core/capabilities/delta/doc.js.map +1 -1
- package/dist/core/capabilities/delta/uncovered.js +2 -2
- package/dist/core/capabilities/delta/uncovered.js.map +1 -1
- package/dist/core/capabilities/findings.js +18 -22
- package/dist/core/capabilities/findings.js.map +1 -1
- package/dist/core/capabilities/realizes/findings.js +12 -19
- package/dist/core/capabilities/realizes/findings.js.map +1 -1
- package/dist/core/capabilities/realizes/join.js +0 -20
- package/dist/core/capabilities/realizes/join.js.map +1 -1
- package/dist/core/capabilities/rollup.js +6 -0
- package/dist/core/capabilities/rollup.js.map +1 -1
- package/dist/core/capabilities/tree.js +6 -28
- package/dist/core/capabilities/tree.js.map +1 -1
- package/dist/core/capabilities/usecase-join.js +3 -13
- package/dist/core/capabilities/usecase-join.js.map +1 -1
- package/dist/core/coherence/authoring/scaffold.js +11 -3
- package/dist/core/coherence/authoring/scaffold.js.map +1 -1
- package/dist/core/coherence/authoring/sentinels.js +2 -1
- package/dist/core/coherence/authoring/sentinels.js.map +1 -1
- 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 +103 -22
- package/dist/core/coherence/coherence.js.map +1 -1
- 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 +60 -34
- package/dist/core/coherence/declared.js.map +1 -1
- package/dist/core/coherence/events/declared.js +44 -59
- package/dist/core/coherence/events/declared.js.map +1 -1
- package/dist/core/coherence/events/events.js +147 -16
- package/dist/core/coherence/events/events.js.map +1 -1
- package/dist/core/coherence/events/grades.js +31 -8
- package/dist/core/coherence/events/grades.js.map +1 -1
- package/dist/core/coherence/events/lookups.js +28 -87
- package/dist/core/coherence/events/lookups.js.map +1 -1
- package/dist/core/coherence/events/produced.js +100 -0
- package/dist/core/coherence/events/produced.js.map +1 -0
- package/dist/core/coherence/lookups.js +18 -78
- package/dist/core/coherence/lookups.js.map +1 -1
- 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/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/delta.js +51 -6
- package/dist/core/delta/delta.js.map +1 -1
- package/dist/core/dependencies/fanin.js +2 -2
- package/dist/core/dependencies/fanin.js.map +1 -1
- 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 +94 -12
- package/dist/core/diff/base-git.js.map +1 -1
- package/dist/core/diff/base-state.js +49 -21
- package/dist/core/diff/base-state.js.map +1 -1
- 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 +22 -6
- package/dist/core/diff/scope/changed-paths.js.map +1 -1
- 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 +100 -31
- package/dist/core/diff/semantic.js.map +1 -1
- package/dist/core/docs.js +31 -22
- package/dist/core/docs.js.map +1 -1
- package/dist/core/doctor/agents.js +34 -18
- package/dist/core/doctor/agents.js.map +1 -1
- package/dist/core/doctor/config.js +7 -3
- package/dist/core/doctor/config.js.map +1 -1
- package/dist/core/doctor/doctor.js +91 -11
- package/dist/core/doctor/doctor.js.map +1 -1
- package/dist/core/doctor/report.js.map +1 -1
- package/dist/core/doctor/reports/scan.js +242 -0
- package/dist/core/doctor/reports/scan.js.map +1 -0
- package/dist/core/document/apply.js +158 -11
- package/dist/core/document/apply.js.map +1 -1
- package/dist/core/document/frontmatter.js +55 -0
- package/dist/core/document/frontmatter.js.map +1 -1
- package/dist/core/document/parse.js +29 -6
- package/dist/core/document/parse.js.map +1 -1
- package/dist/core/document/scenarios.js +17 -0
- package/dist/core/document/scenarios.js.map +1 -1
- package/dist/core/document/spec.js +4 -11
- package/dist/core/document/spec.js.map +1 -1
- package/dist/core/envelope/config.js +10 -0
- package/dist/core/envelope/config.js.map +1 -1
- package/dist/core/envelope/json.js +34 -0
- package/dist/core/envelope/json.js.map +1 -1
- package/dist/core/explain/families.js +26 -21
- package/dist/core/explain/families.js.map +1 -1
- package/dist/core/explain/lookup.js +14 -1
- package/dist/core/explain/lookup.js.map +1 -1
- package/dist/core/explain/refusals.js +5 -5
- package/dist/core/explain/refusals.js.map +1 -1
- 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 +68 -109
- package/dist/core/explain/terms.js.map +1 -1
- package/dist/core/explore/explore.js +40 -10
- package/dist/core/explore/explore.js.map +1 -1
- package/dist/core/fleet-context.js +81 -95
- package/dist/core/fleet-context.js.map +1 -1
- package/dist/core/gate/checks.js +11 -4
- package/dist/core/gate/checks.js.map +1 -1
- package/dist/core/gate/partners.js +69 -28
- package/dist/core/gate/partners.js.map +1 -1
- package/dist/core/gate/report.js.map +1 -1
- package/dist/core/gate/verification.js +75 -12
- package/dist/core/gate/verification.js.map +1 -1
- package/dist/core/gherkin/stale.js +13 -37
- package/dist/core/gherkin/stale.js.map +1 -1
- package/dist/core/glossary/delta.js +10 -7
- package/dist/core/glossary/delta.js.map +1 -1
- package/dist/core/glossary/tree.js +6 -19
- package/dist/core/glossary/tree.js.map +1 -1
- package/dist/core/kernel/concurrency.js +19 -0
- package/dist/core/kernel/concurrency.js.map +1 -1
- 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/path-safety.js +38 -0
- package/dist/core/kernel/path-safety.js.map +1 -1
- package/dist/core/kernel/records.js +11 -0
- package/dist/core/kernel/records.js.map +1 -1
- package/dist/core/links/backlinks.js +1 -3
- package/dist/core/links/backlinks.js.map +1 -1
- package/dist/core/links/corpus.js +51 -37
- package/dist/core/links/corpus.js.map +1 -1
- package/dist/core/links/findings.js.map +1 -1
- package/dist/core/links/parse.js +38 -9
- package/dist/core/links/parse.js.map +1 -1
- package/dist/core/mcp/argv.js +101 -0
- package/dist/core/mcp/argv.js.map +1 -1
- package/dist/core/mcp/author-tools.js +2 -1
- package/dist/core/mcp/author-tools.js.map +1 -1
- package/dist/core/mcp/protocol.js +2 -2
- package/dist/core/mcp/protocol.js.map +1 -1
- package/dist/core/mcp/tools.js +43 -33
- package/dist/core/mcp/tools.js.map +1 -1
- package/dist/core/openapi/baseline/gate.js +53 -12
- package/dist/core/openapi/baseline/gate.js.map +1 -1
- package/dist/core/openapi/baseline/plan.js +40 -10
- package/dist/core/openapi/baseline/plan.js.map +1 -1
- package/dist/core/openapi/baseline/record.js +0 -1
- package/dist/core/openapi/baseline/record.js.map +1 -1
- 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 +38 -24
- package/dist/core/openapi/depth.js.map +1 -1
- package/dist/core/openapi/digest.js +52 -2
- package/dist/core/openapi/digest.js.map +1 -1
- package/dist/core/openapi/doc.js +12 -4
- package/dist/core/openapi/doc.js.map +1 -1
- package/dist/core/openapi/merge/components.js +25 -60
- package/dist/core/openapi/merge/components.js.map +1 -1
- package/dist/core/openapi/merge/error.js +3 -13
- package/dist/core/openapi/merge/error.js.map +1 -1
- package/dist/core/openapi/merge/markers.js +26 -30
- package/dist/core/openapi/merge/markers.js.map +1 -1
- package/dist/core/openapi/merge/merge.js +28 -52
- package/dist/core/openapi/merge/merge.js.map +1 -1
- package/dist/core/openapi/merge/pin.js +17 -35
- package/dist/core/openapi/merge/pin.js.map +1 -1
- package/dist/core/openspec/decide/verdict.js.map +1 -1
- package/dist/core/openspec/inventory.js +4 -5
- package/dist/core/openspec/inventory.js.map +1 -1
- package/dist/core/openspec/model/mapping.js +30 -28
- package/dist/core/openspec/model/mapping.js.map +1 -1
- package/dist/core/openspec/model/model.js +12 -7
- package/dist/core/openspec/model/model.js.map +1 -1
- package/dist/core/openspec/scan/changes.js +10 -4
- package/dist/core/openspec/scan/changes.js.map +1 -1
- package/dist/core/openspec/scan/config.js +7 -16
- package/dist/core/openspec/scan/config.js.map +1 -1
- package/dist/core/openspec/scan/shape.js +63 -19
- package/dist/core/openspec/scan/shape.js.map +1 -1
- package/dist/core/openspec/scan/walk.js +21 -38
- package/dist/core/openspec/scan/walk.js.map +1 -1
- package/dist/core/pack/living.js +43 -4
- package/dist/core/pack/living.js.map +1 -1
- package/dist/core/pack/pack.js +50 -6
- package/dist/core/pack/pack.js.map +1 -1
- package/dist/core/projection/arch-slice.js +2 -2
- package/dist/core/projection/arch-slice.js.map +1 -1
- package/dist/core/projection/introduced.js +14 -0
- package/dist/core/projection/introduced.js.map +1 -0
- package/dist/core/provenance/findings.js +48 -12
- package/dist/core/provenance/findings.js.map +1 -1
- package/dist/core/provenance/git.js +33 -57
- package/dist/core/provenance/git.js.map +1 -1
- package/dist/core/provenance/gitq/moves.js +71 -114
- package/dist/core/provenance/gitq/moves.js.map +1 -1
- package/dist/core/provenance/gitq/vouched-ancestor.js +2 -2
- package/dist/core/provenance/gitq/vouched-ancestor.js.map +1 -1
- package/dist/core/provenance/sources.js +23 -6
- package/dist/core/provenance/sources.js.map +1 -1
- package/dist/core/provenance/stamp.js +5 -17
- package/dist/core/provenance/stamp.js.map +1 -1
- package/dist/core/repo/authored/paths.js +18 -0
- package/dist/core/repo/authored/paths.js.map +1 -1
- package/dist/core/repo/entries.js.map +1 -1
- package/dist/core/repo/paths.js +92 -6
- package/dist/core/repo/paths.js.map +1 -1
- package/dist/core/repo/repo.js +74 -14
- package/dist/core/repo/repo.js.map +1 -1
- package/dist/core/repo/tree/find.js +12 -3
- package/dist/core/repo/tree/find.js.map +1 -1
- package/dist/core/repo/tree/fs.js +27 -1
- package/dist/core/repo/tree/fs.js.map +1 -1
- 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 +53 -32
- package/dist/core/repo/tree/walk.js.map +1 -1
- package/dist/core/results.js +47 -12
- package/dist/core/results.js.map +1 -1
- package/dist/core/scaffold/landscape.js +121 -13
- package/dist/core/scaffold/landscape.js.map +1 -1
- package/dist/core/scaffold/legacy.js +271 -0
- package/dist/core/scaffold/legacy.js.map +1 -0
- package/dist/core/staging/commit.js +26 -15
- package/dist/core/staging/commit.js.map +1 -1
- package/dist/core/staging/lock.js +74 -12
- package/dist/core/staging/lock.js.map +1 -1
- package/dist/core/staging/recovery/intent.js +2 -5
- package/dist/core/staging/recovery/intent.js.map +1 -1
- package/dist/core/staging/recovery/recover.js +84 -6
- package/dist/core/staging/recovery/recover.js.map +1 -1
- package/dist/core/staging/snapshot/manifest.js +188 -0
- package/dist/core/staging/snapshot/manifest.js.map +1 -0
- package/dist/core/staging/{snapshot.js → snapshot/snapshot.js} +39 -45
- package/dist/core/staging/snapshot/snapshot.js.map +1 -0
- package/dist/core/staging/txn/forward.js +24 -14
- package/dist/core/staging/txn/forward.js.map +1 -1
- package/dist/core/staging/writes.js.map +1 -1
- package/dist/core/status/actions/execution.js +11 -0
- package/dist/core/status/actions/execution.js.map +1 -1
- package/dist/core/status/contracts.js +39 -15
- package/dist/core/status/contracts.js.map +1 -1
- package/dist/core/status/feature/artifacts.js +33 -8
- package/dist/core/status/feature/artifacts.js.map +1 -1
- package/dist/core/status/feature/feature.js +24 -17
- package/dist/core/status/feature/feature.js.map +1 -1
- package/dist/core/status/feature/next.js +20 -7
- package/dist/core/status/feature/next.js.map +1 -1
- 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 +43 -14
- package/dist/core/status/fleet/fleet.js.map +1 -1
- package/dist/core/status/fleet/next.js +153 -58
- package/dist/core/status/fleet/next.js.map +1 -1
- package/dist/core/status/report.js.map +1 -1
- package/dist/core/status/scan.js.map +1 -1
- package/dist/core/status/verification.js +30 -15
- package/dist/core/status/verification.js.map +1 -1
- 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 +11 -14
- package/dist/core/usecases/capability.js.map +1 -1
- package/dist/core/usecases/delta/claims.js +31 -7
- package/dist/core/usecases/delta/claims.js.map +1 -1
- package/dist/core/usecases/delta/flows.js +5 -7
- package/dist/core/usecases/delta/flows.js.map +1 -1
- 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 +32 -191
- package/dist/core/usecases/delta/overlay.js.map +1 -1
- package/dist/core/usecases/fleet.js +195 -36
- package/dist/core/usecases/fleet.js.map +1 -1
- package/dist/{commands/validate/fleet/usecases → core/usecases/grade}/capability-tag.js +8 -9
- 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/{commands/validate/fleet/usecases → core/usecases/grade}/requirement-tag.js +3 -4
- package/dist/core/usecases/grade/requirement-tag.js.map +1 -0
- package/dist/{commands/validate/fleet/usecases → core/usecases/grade}/steps.js +102 -33
- package/dist/core/usecases/grade/steps.js.map +1 -0
- package/dist/{commands/validate/fleet/usecases → core/usecases/grade}/usecases.js +23 -10
- package/dist/core/usecases/grade/usecases.js.map +1 -0
- package/dist/core/usecases/operations.js +26 -14
- package/dist/core/usecases/operations.js.map +1 -1
- package/dist/core/usecases/place.js.map +1 -1
- 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/verify/answers.js +12 -5
- package/dist/core/verify/answers.js.map +1 -1
- package/dist/core/verify/build.js +102 -82
- package/dist/core/verify/build.js.map +1 -1
- package/dist/core/verify/checklist.js +70 -12
- package/dist/core/verify/checklist.js.map +1 -1
- package/dist/core/verify/location.js +67 -0
- package/dist/core/verify/location.js.map +1 -0
- package/dist/core/verify/pins/lint.js +3 -2
- package/dist/core/verify/pins/lint.js.map +1 -1
- package/dist/core/verify/pins/pin.js +1 -1
- package/dist/core/verify/pins/pin.js.map +1 -1
- package/dist/core/verify/read/file.js +224 -0
- package/dist/core/verify/read/file.js.map +1 -0
- package/dist/core/verify/{file.js → read/shape.js} +16 -104
- 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 +35 -12
- package/dist/core/verify/record.js.map +1 -1
- package/dist/core/verify/store/commit.js +40 -30
- package/dist/core/verify/store/commit.js.map +1 -1
- package/dist/core/verify/store/render.js +8 -4
- package/dist/core/verify/store/render.js.map +1 -1
- package/dist/core/vocabulary/issue.js +4 -0
- package/dist/core/vocabulary/issue.js.map +1 -1
- package/dist/core/vocabulary/maturity.js +75 -4
- package/dist/core/vocabulary/maturity.js.map +1 -1
- package/dist/core/vocabulary/report.js +16 -1
- package/dist/core/vocabulary/report.js.map +1 -1
- package/examples/README.md +54 -11
- package/examples/docs/architecture/landscape.likec4 +62 -6
- package/examples/docs/architecture/services.likec4 +70 -0
- package/examples/docs/architecture/subsystems.likec4 +7 -0
- package/examples/docs/architecture/usecases/order-notification.likec4 +16 -7
- package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-service/asyncapi.yaml +11 -8
- package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-split-service/openapi.yaml +6 -6
- package/examples/docs/features/FEAT-112-retire-order-v1/specs/order-service/openapi.yaml +4 -1
- package/examples/docs/features/archive/FEAT-088-refunds/specs/payment-service/openapi.yaml +13 -10
- package/examples/docs/likec4.config.json +0 -1
- package/examples/docs/services/checkout-web/model.likec4 +39 -56
- package/examples/docs/services/order-service/arch.spec.md +13 -6
- package/examples/docs/services/order-service/asyncapi.yaml +3 -2
- package/examples/docs/services/order-service/model.likec4 +58 -70
- package/examples/docs/services/payment-service/arch.spec.md +7 -4
- package/examples/docs/services/payment-service/model.likec4 +38 -37
- package/examples/docs/services/platform/identity-service/arch.spec.md +7 -4
- package/examples/docs/services/platform/identity-service/model.likec4 +35 -37
- package/examples/docs/services/platform/notification-service/asyncapi.yaml +2 -1
- package/examples/docs/services/platform/notification-service/health.yaml +8 -3
- package/examples/docs/services/platform/notification-service/model.likec4 +43 -64
- package/package.json +1 -1
- package/dist/commands/validate/checks/vocabulary.js +0 -31
- package/dist/commands/validate/checks/vocabulary.js.map +0 -1
- package/dist/commands/validate/fleet/usecases/capability-tag.js.map +0 -1
- package/dist/commands/validate/fleet/usecases/requirement-tag.js.map +0 -1
- package/dist/commands/validate/fleet/usecases/steps.js.map +0 -1
- package/dist/commands/validate/fleet/usecases/usecases.js.map +0 -1
- package/dist/core/agent/agents-md/artifacts.js +0 -220
- package/dist/core/agent/agents-md/artifacts.js.map +0 -1
- package/dist/core/agent/agents-md/cycle.js +0 -165
- package/dist/core/agent/agents-md/cycle.js.map +0 -1
- package/dist/core/agent/agents-md/shipped/archive-gate.js +0 -98
- package/dist/core/agent/agents-md/shipped/archive-gate.js.map +0 -1
- package/dist/core/agent/agents-md/spine.js +0 -40
- package/dist/core/agent/agents-md/spine.js.map +0 -1
- package/dist/core/coherence/events/merged.js +0 -40
- package/dist/core/coherence/events/merged.js.map +0 -1
- package/dist/core/diff/current-state.js +0 -96
- package/dist/core/diff/current-state.js.map +0 -1
- package/dist/core/diff/victims.js +0 -247
- package/dist/core/diff/victims.js.map +0 -1
- package/dist/core/repo/tree/views.js +0 -172
- package/dist/core/repo/tree/views.js.map +0 -1
- package/dist/core/staging/snapshot.js.map +0 -1
- package/dist/core/verify/file.js.map +0 -1
|
@@ -25,9 +25,16 @@ this service's own `model.likec4` plus the landscape (`covers.unknown`, with a d
|
|
|
25
25
|
hint, is the typo guard — a mistyped entry otherwise costs exactly the coverage it was written
|
|
26
26
|
for), and every `slis[].name` and `alerts[].name` in `health.yaml` must be named by one of them
|
|
27
27
|
(`health.uncovered`, or a signal ships to the on-call rotation with nothing testing it). Edge
|
|
28
|
-
entries below are spelled as this model draws them — `orderService.outbox ->
|
|
29
|
-
— because the endpoint that matters is the container; `order-service ->
|
|
30
|
-
resolves too, through the `metadata { service }` binding on the
|
|
28
|
+
entries below are spelled as this model draws them — `marketplace.orderService.outbox ->
|
|
29
|
+
kafka.orderEvents` — because the endpoint that matters is the container; `order-service ->
|
|
30
|
+
payment-service` resolves too, through the `metadata { service }` binding on the map's element.
|
|
31
|
+
|
|
32
|
+
Element ids here carry the FULL path, `marketplace.` and all. That is a consequence of the model
|
|
33
|
+
shape rather than a style: `model.likec4` extends the element the fleet map declares inside the
|
|
34
|
+
`marketplace` group, so the container it adds is `marketplace.orderService.db` and no shorter
|
|
35
|
+
spelling of it exists. A service whose model declares its own `specification` and is parsed alone
|
|
36
|
+
mints shorter ids and writes them here — see SCHEMA.md, "Two shapes of a service model", which also
|
|
37
|
+
lists requalifying these lines as a step of the migration between the two.
|
|
31
38
|
|
|
32
39
|
## Requirements
|
|
33
40
|
|
|
@@ -40,7 +47,7 @@ key rather than placing a second order or requesting a second authorization. che
|
|
|
40
47
|
retry on a gateway timeout is not a rare path — it is the normal shape of a mobile checkout —
|
|
41
48
|
and without the key a customer's flaky connection charges the card twice.
|
|
42
49
|
|
|
43
|
-
Covers: orderService.db, orderService.domain -> paymentService
|
|
50
|
+
Covers: marketplace.orderService.db, marketplace.orderService.domain -> marketplace.paymentService
|
|
44
51
|
|
|
45
52
|
#### Scenario: checkout-web retries a placement it never saw acknowledged
|
|
46
53
|
- **Given** an order placed under `Idempotency-Key` "ik-8842" with an authorization already requested
|
|
@@ -63,7 +70,7 @@ database and then to kafka. A dual write has no failure mode in which both sides
|
|
|
63
70
|
between them either announces an order nobody stored or stores one nobody hears about, and
|
|
64
71
|
notification-service is the service that pays for the second case.
|
|
65
72
|
|
|
66
|
-
Covers: orderService.outbox, orderService.outbox -> kafka.orderEvents
|
|
73
|
+
Covers: marketplace.orderService.outbox, marketplace.orderService.outbox -> kafka.orderEvents
|
|
67
74
|
|
|
68
75
|
#### Scenario: The broker is unavailable when an order is placed
|
|
69
76
|
- **Given** an accepted order whose `OrderPlaced` row is still in the outbox table
|
|
@@ -86,7 +93,7 @@ already recorded. The producer's outbox promises at-least-once delivery and a re
|
|
|
86
93
|
redelivers whatever was in flight, so a consumer without a ledger is a consumer that confirms
|
|
87
94
|
an order it already confirmed — and, once ORD-CANCEL has moved on, resurrects a cancelled one.
|
|
88
95
|
|
|
89
|
-
Covers: orderService.consumer, kafka.paymentEvents -> orderService.consumer
|
|
96
|
+
Covers: marketplace.orderService.consumer, kafka.paymentEvents -> marketplace.orderService.consumer
|
|
90
97
|
Consumes: payment.PaymentAuthorized
|
|
91
98
|
|
|
92
99
|
#### Scenario: The same authorization is redelivered after a consumer rebalance
|
|
@@ -5,8 +5,9 @@
|
|
|
5
5
|
# `action: send|receive`, which is the exact analog of an `operationId` and the thing
|
|
6
6
|
# that makes direction legible; 2.x spells the same thing as publish/subscribe under
|
|
7
7
|
# a channel, where the two words are ambiguous about whose perspective they take. A
|
|
8
|
-
# 2.x document declares no `operations` at all, so loam
|
|
9
|
-
#
|
|
8
|
+
# 2.x document declares no `operations` at all, so loam refuses it as one
|
|
9
|
+
# `asyncapi.invalid` naming the version rather than reading it as a contract with no
|
|
10
|
+
# messages (`asyncapi convert --target-version=3.0.0` upgrades it).
|
|
10
11
|
#
|
|
11
12
|
# The join is the message NAME, spelled three times and required to be identical: the
|
|
12
13
|
# landscape edge's `metadata { publishes }` / `metadata { consumes }`, a requirement's
|
|
@@ -1,30 +1,27 @@
|
|
|
1
|
-
// order-service's own C4 — the
|
|
1
|
+
// order-service's own C4 — what is INSIDE the element the fleet map binds to
|
|
2
|
+
// services/order-service/.
|
|
2
3
|
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
4
|
+
// This is an EXTENDING model: it declares no `specification` block, so every
|
|
5
|
+
// kind and tag it uses comes from architecture/landscape.likec4, and it declares
|
|
6
|
+
// no partner of its own. The map already says that order-service exists, what it
|
|
7
|
+
// is called and which directory it binds to; this file says what is inside it,
|
|
8
|
+
// with `extend` on the fully-qualified id the map gave that element. The id has
|
|
9
|
+
// to be the full path — `extend orderService` resolves to nothing, because the
|
|
10
|
+
// element is nested in the `marketplace` group.
|
|
11
|
+
//
|
|
12
|
+
// Nothing here re-declares kafka, payment-service or identity-service. That is
|
|
13
|
+
// the whole point of the shape: the root likec4.config.json does not exclude
|
|
14
|
+
// `services/**`, so the map and every model are ONE LikeC4 project, an element
|
|
15
|
+
// is declared exactly once, and two documents cannot disagree about its tags or
|
|
16
|
+
// its description. A PARTNER is what this file refers to and never owns — the
|
|
17
|
+
// map's element, reached by the id the map spells. An element declared here
|
|
18
|
+
// outside `marketplace.orderService` would be `c4.element-unowned`.
|
|
19
|
+
//
|
|
20
|
+
// SCHEMA.md, "Two shapes of a service model", has the other shape (a model that
|
|
21
|
+
// declares its own `specification` and is parsed alone) and the recipe for
|
|
22
|
+
// migrating between them.
|
|
16
23
|
model {
|
|
17
|
-
orderService
|
|
18
|
-
description 'Owns the order lifecycle and orchestrates the payment behind it'
|
|
19
|
-
// The binding, not the title, is what ties this element to services/order-service/,
|
|
20
|
-
// and it is what every join downstream resolves through: health.yaml's dependency
|
|
21
|
-
// ids, an `arch.spec.md` edge entry written as `order-service -> payment-service`,
|
|
22
|
-
// the landscape's twin element. Rename the box without it and each of those stops
|
|
23
|
-
// matching in silence.
|
|
24
|
-
metadata {
|
|
25
|
-
service 'order-service'
|
|
26
|
-
}
|
|
27
|
-
|
|
24
|
+
extend marketplace.orderService {
|
|
28
25
|
api = container 'api' {
|
|
29
26
|
description 'REST API: createOrder, getOrder, cancelOrder, and the deprecated createOrderV1'
|
|
30
27
|
technology 'Spring Boot'
|
|
@@ -36,7 +33,8 @@ model {
|
|
|
36
33
|
// The two background containers exist in this model because arch.spec.md has to
|
|
37
34
|
// be able to point at them: ARCH-ORD-OUTBOX and ARCH-ORD-DEDUPE cover them by id,
|
|
38
35
|
// and an obligation whose subject is not modelled is an obligation no `Covers:`
|
|
39
|
-
// line can name.
|
|
36
|
+
// line can name. Written the way the map spells them —
|
|
37
|
+
// `marketplace.orderService.outbox` — because that is the id this file makes.
|
|
40
38
|
outbox = container 'outbox-relay' {
|
|
41
39
|
description 'Publishes committed outbox rows to order.events.v1 — at-least-once'
|
|
42
40
|
technology 'Kotlin'
|
|
@@ -45,58 +43,45 @@ model {
|
|
|
45
43
|
description 'Applies payment.PaymentAuthorized once per paymentId, then advances the order'
|
|
46
44
|
technology 'Kotlin'
|
|
47
45
|
}
|
|
48
|
-
// The store is a NESTED container of this service,
|
|
49
|
-
//
|
|
50
|
-
//
|
|
51
|
-
//
|
|
46
|
+
// The store is a NESTED container of this service, and that is this fleet's
|
|
47
|
+
// CHOICE rather than a rule: loam grades neither placement, and the same store
|
|
48
|
+
// drawn beside the services in the landscape earns no finding either. What the
|
|
49
|
+
// choice decides is one thing, and it is a fact about LikeC4 rather than a
|
|
50
|
+
// preference: an edge naming `marketplace.orderService.db` resolves only for a
|
|
51
|
+
// project that holds this file, and a per-service project is `architecture/`
|
|
52
|
+
// plus ONE model — so a store a second service will name belongs on the map,
|
|
53
|
+
// inside `marketplace.orderService`. Nesting hides nothing meanwhile: a second
|
|
54
|
+
// service reaching the same data earns `landscape.datastore-shared`, counted
|
|
55
|
+
// from that service's own model.
|
|
56
|
+
// The `database` kind is the landscape's, declared there once for every model that needs it.
|
|
52
57
|
db = database 'db' {
|
|
53
58
|
description 'Orders, idempotency keys, the applied-payment ledger and the outbox table'
|
|
54
59
|
technology 'PostgreSQL'
|
|
55
60
|
}
|
|
56
61
|
|
|
62
|
+
// The internal edges, written INSIDE the extend block, where the children
|
|
63
|
+
// resolve by their short names.
|
|
57
64
|
api -> domain 'Places, reads and cancels'
|
|
58
65
|
domain -> db 'Writes the order, its idempotency key and its outbox row in one transaction'
|
|
59
66
|
outbox -> db 'Polls unpublished outbox rows and marks them sent'
|
|
60
67
|
consumer -> db 'Records the applied paymentId, then advances the order'
|
|
61
68
|
}
|
|
62
69
|
|
|
63
|
-
//
|
|
64
|
-
//
|
|
65
|
-
// the
|
|
66
|
-
//
|
|
67
|
-
//
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
metadata {
|
|
71
|
-
service 'payment-service'
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
identityService = softwareSystem 'identity-service' {
|
|
75
|
-
description 'Issues and introspects access tokens'
|
|
76
|
-
metadata {
|
|
77
|
-
service 'identity-service'
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
kafka = softwareSystem 'kafka' {
|
|
81
|
-
description 'Event backbone (platform)'
|
|
82
|
-
// A topic per channel rather than one broker box. What a producer and a consumer
|
|
83
|
-
// actually share is the channel, and pointing every edge at the broker turns the
|
|
84
|
-
// fleet map into a star with one node in the middle the moment the fleet is
|
|
85
|
-
// bigger than this example.
|
|
86
|
-
orderEvents = topic 'order.events'
|
|
87
|
-
paymentEvents = topic 'payment.events'
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
// The edges, drawn from the container that really makes each call — which is the
|
|
91
|
-
// half of the truth the landscape cannot hold. A model with elements and no
|
|
92
|
-
// relationships beside a health.yaml declaring two dependencies is
|
|
93
|
-
// `c4.no-relationships`: a service that reaches nothing is almost never true.
|
|
70
|
+
// The cross-boundary edges, drawn OUTSIDE the extend block, from the container
|
|
71
|
+
// that really makes each call to the other party's element as the MAP spells
|
|
72
|
+
// it — which is the half of the truth the landscape cannot hold, since the map
|
|
73
|
+
// carries only the service-level crossing. This file names no `kafka` of its
|
|
74
|
+
// own: `kafka.orderEvents` is the map's topic, and pointing at it is what makes
|
|
75
|
+
// health.yaml's `kafka` dependency resolve (a partner brings its ancestors with
|
|
76
|
+
// it, so the broker answers even though only its topic is named).
|
|
94
77
|
//
|
|
95
78
|
// The `metadata` blocks below are not read for a service model — only landscape
|
|
96
79
|
// edges feed `spine.op-*` and the event spine — but they are written anyway so the
|
|
97
80
|
// two documents cannot drift into disagreeing about which operation and which
|
|
98
|
-
// message each edge stands for.
|
|
99
|
-
|
|
81
|
+
// message each edge stands for. A model with elements and no relationships beside
|
|
82
|
+
// a health.yaml declaring two dependencies is `c4.no-relationships`: a service
|
|
83
|
+
// that reaches nothing is almost never true.
|
|
84
|
+
marketplace.orderService.domain -> marketplace.paymentService 'Calls authorizePayment' {
|
|
100
85
|
metadata {
|
|
101
86
|
op 'authorizePayment'
|
|
102
87
|
}
|
|
@@ -104,12 +89,12 @@ model {
|
|
|
104
89
|
// ORD-CANCEL's `Requires: user/orders:cancel` has to be enforced somewhere, and this
|
|
105
90
|
// is that edge: the API introspects the caller's token before it will cancel anything.
|
|
106
91
|
// Drawn here and absent from health.yaml, which states the asymmetry and the reason.
|
|
107
|
-
orderService.api -> identityService 'Calls introspectToken' {
|
|
92
|
+
marketplace.orderService.api -> marketplace.identityService 'Calls introspectToken' {
|
|
108
93
|
metadata {
|
|
109
94
|
op 'introspectToken'
|
|
110
95
|
}
|
|
111
96
|
}
|
|
112
|
-
orderService.outbox -> kafka.orderEvents 'Publishes OrderPlaced' {
|
|
97
|
+
marketplace.orderService.outbox -> kafka.orderEvents 'Publishes OrderPlaced' {
|
|
113
98
|
metadata {
|
|
114
99
|
publishes 'order.OrderPlaced'
|
|
115
100
|
}
|
|
@@ -119,7 +104,7 @@ model {
|
|
|
119
104
|
// edge drawn the other way round binds to nothing. Nothing grades it in a
|
|
120
105
|
// service model, which is exactly why it follows the same convention — a
|
|
121
106
|
// reader who learns the arrow here should not have to unlearn it upstairs.
|
|
122
|
-
kafka.paymentEvents -> orderService.consumer 'PaymentAuthorized advances the order' {
|
|
107
|
+
kafka.paymentEvents -> marketplace.orderService.consumer 'PaymentAuthorized advances the order' {
|
|
123
108
|
metadata {
|
|
124
109
|
consumes 'payment.PaymentAuthorized'
|
|
125
110
|
}
|
|
@@ -127,12 +112,15 @@ model {
|
|
|
127
112
|
}
|
|
128
113
|
|
|
129
114
|
// Views are the LikeC4 renderer's, never loam's — no check reads this block. Scoped
|
|
130
|
-
// to the
|
|
131
|
-
// the fleet-wide one is already answered in architecture/landscape.likec4.
|
|
115
|
+
// to the service's element, because "what does an order stand on" is this file's
|
|
116
|
+
// question and the fleet-wide one is already answered in architecture/landscape.likec4.
|
|
117
|
+
// This file is part of the ROOT project, beside the map: `npx likec4 start` at the
|
|
118
|
+
// docs root draws it, and there is no per-service likec4.config.json to write.
|
|
119
|
+
// View ids are flat across the whole project, so this one is spelled to be unique.
|
|
132
120
|
views {
|
|
133
|
-
view order_service of orderService {
|
|
121
|
+
view order_service of marketplace.orderService {
|
|
134
122
|
title 'order-service — containers, its store, and what it reaches'
|
|
135
123
|
include *
|
|
136
|
-
include paymentService, identityService, kafka, kafka.*
|
|
124
|
+
include marketplace.paymentService, marketplace.identityService, kafka, kafka.*
|
|
137
125
|
}
|
|
138
126
|
}
|
|
@@ -15,9 +15,12 @@ its scenarios exercise, and `loam validate` checks every entry resolves
|
|
|
15
15
|
(`covers.unknown`) and every declared alert/SLI is covered (`health.uncovered`).
|
|
16
16
|
|
|
17
17
|
An edge entry resolves by exact element id **or** by the service an endpoint stands for, which
|
|
18
|
-
is why the entries below name `payment-service` rather than `marketplace.paymentService`:
|
|
19
|
-
landscape draws this service inside a grouping element, and
|
|
20
|
-
|
|
18
|
+
is why the edge entries below name `payment-service` rather than `marketplace.paymentService`:
|
|
19
|
+
the landscape draws this service inside a grouping element, and an edge written against a group
|
|
20
|
+
path would have to be rewritten the day somebody moves the box. A CONTAINER has no such coarser
|
|
21
|
+
name, so `marketplace.paymentService.outbox` is spelled in full — `model.likec4` extends the
|
|
22
|
+
element the map declares inside `marketplace`, so that IS the container's id. SCHEMA.md, "Two
|
|
23
|
+
shapes of a service model", has the rule and the migration step that requalifies these lines.
|
|
21
24
|
|
|
22
25
|
## Requirements
|
|
23
26
|
|
|
@@ -27,7 +30,7 @@ Requirement-ID: ARCH-PAY-OUTBOX
|
|
|
27
30
|
The service SHALL write a domain event and the state change it reports in one
|
|
28
31
|
database transaction, published to kafka by an outbox relay — never a dual write.
|
|
29
32
|
|
|
30
|
-
Covers: paymentService.outbox, payment-service -> kafka.paymentEvents
|
|
33
|
+
Covers: marketplace.paymentService.outbox, payment-service -> kafka.paymentEvents
|
|
31
34
|
Publishes: payment.PaymentAuthorized, payment.PaymentCaptured
|
|
32
35
|
|
|
33
36
|
#### Scenario: Broker down at commit time
|
|
@@ -1,19 +1,21 @@
|
|
|
1
|
-
//
|
|
1
|
+
// payment-service's own C4 — what is INSIDE the element the fleet map binds to
|
|
2
|
+
// services/payment-service/. Written by an agent from the `loam adopt` brief,
|
|
3
|
+
// then curated.
|
|
2
4
|
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
// `likec4.config.json`
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
5
|
+
// An EXTENDING model: no `specification` block of its own, no copy of any
|
|
6
|
+
// partner. The kinds (`container`, `database`) and every element this file
|
|
7
|
+
// points at are declared once in architecture/landscape.likec4, and the root
|
|
8
|
+
// `likec4.config.json` does not exclude `services/**`, so the map and every
|
|
9
|
+
// model are one LikeC4 project. `extend` takes the FULLY-QUALIFIED id — the
|
|
10
|
+
// element is nested in the `marketplace` group, so `extend paymentService`
|
|
11
|
+
// would resolve to nothing.
|
|
12
|
+
//
|
|
13
|
+
// There is no likec4.config.json beside this file and loam never writes one for
|
|
14
|
+
// an extending model: it belongs to the root project, so `npx likec4 start` at
|
|
15
|
+
// the docs root already draws it beside the map. SCHEMA.md, "Two shapes of a
|
|
16
|
+
// service model", has the other shape and the migration recipe.
|
|
13
17
|
model {
|
|
14
|
-
paymentService
|
|
15
|
-
description 'Owns payment authorization/capture'
|
|
16
|
-
|
|
18
|
+
extend marketplace.paymentService {
|
|
17
19
|
api = container 'api' {
|
|
18
20
|
description 'REST API'
|
|
19
21
|
technology 'Spring Boot'
|
|
@@ -22,10 +24,12 @@ model {
|
|
|
22
24
|
description 'Payment domain logic'
|
|
23
25
|
technology 'Java'
|
|
24
26
|
}
|
|
25
|
-
// The store is a container of THIS service
|
|
26
|
-
//
|
|
27
|
-
//
|
|
28
|
-
//
|
|
27
|
+
// The store is a container of THIS service rather than a fleet-level peer —
|
|
28
|
+
// where a store is drawn is the team's choice and loam grades neither, so
|
|
29
|
+
// this is a decision the example makes and explains, not one it was forced
|
|
30
|
+
// into. Kept here because nothing else reaches this data: the day something
|
|
31
|
+
// does, its edge resolves only against a declaration the MAP holds, and the
|
|
32
|
+
// store moves up into `marketplace.paymentService` on the landscape.
|
|
29
33
|
db = database 'db' {
|
|
30
34
|
description 'Payments store'
|
|
31
35
|
technology 'PostgreSQL'
|
|
@@ -40,28 +44,25 @@ model {
|
|
|
40
44
|
domain -> outbox 'Appends events in the state-change transaction'
|
|
41
45
|
}
|
|
42
46
|
|
|
43
|
-
//
|
|
44
|
-
//
|
|
45
|
-
//
|
|
46
|
-
//
|
|
47
|
-
//
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
stripe
|
|
55
|
-
description 'Card acquirer'
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
paymentService.outbox -> kafka 'Relay publishes payment events'
|
|
59
|
-
paymentService.domain -> identityService 'Validates the caller token'
|
|
60
|
-
paymentService.domain -> stripe 'Authorizes and captures cards'
|
|
47
|
+
// Everything the service touches across its own boundary, drawn from the
|
|
48
|
+
// container that really touches it to the other party's element AS THE MAP
|
|
49
|
+
// SPELLS IT — never a copy of that element. The landscape carries only the
|
|
50
|
+
// service-level crossing; these three edges say which container makes it.
|
|
51
|
+
// health.yaml's three dependencies resolve through them
|
|
52
|
+
// (`health.dependency-unmodelled` otherwise): `identity-service` through the
|
|
53
|
+
// binding on the map's element, `stripe` by its id, and `kafka` because a
|
|
54
|
+
// partner brings its ancestors — the edge names the TOPIC and the broker
|
|
55
|
+
// answers for it.
|
|
56
|
+
marketplace.paymentService.outbox -> kafka.paymentEvents 'Relay publishes payment events'
|
|
57
|
+
marketplace.paymentService.domain -> marketplace.identityService 'Validates the caller token'
|
|
58
|
+
marketplace.paymentService.domain -> stripe 'Authorizes and captures cards'
|
|
61
59
|
}
|
|
62
60
|
|
|
61
|
+
// Views are the LikeC4 renderer's, never loam's. This file is part of the root
|
|
62
|
+
// project, so `npx likec4 start` at the docs root draws this view beside the
|
|
63
|
+
// fleet map with nothing else to write.
|
|
63
64
|
views {
|
|
64
|
-
view payment_service of paymentService {
|
|
65
|
+
view payment_service of marketplace.paymentService {
|
|
65
66
|
include *
|
|
66
67
|
}
|
|
67
68
|
}
|
|
@@ -23,8 +23,11 @@ element id, an edge `source -> target`, or a health signal `sli:<id>` / `alert:<
|
|
|
23
23
|
is `covers.unknown` (a mistyped id silently costs exactly the coverage it was written
|
|
24
24
|
for), and an SLI or alert in `health.yaml` that no requirement here covers is
|
|
25
25
|
`health.uncovered`. Every id below comes from `model.likec4` or `health.yaml` in this
|
|
26
|
-
directory;
|
|
27
|
-
|
|
26
|
+
directory; no entry names another service, because everything this service touches is
|
|
27
|
+
inside its own boundary. The element ids carry the full `marketplace.identityService.`
|
|
28
|
+
path because that is what the ids ARE: `model.likec4` extends the element the fleet map
|
|
29
|
+
declares inside the `marketplace` group, so a container it adds has no shorter spelling.
|
|
30
|
+
SCHEMA.md, "Two shapes of a service model", has the rule.
|
|
28
31
|
|
|
29
32
|
## Requirements
|
|
30
33
|
|
|
@@ -41,7 +44,7 @@ one a single-instance test never catches: the signer and the verifier are differ
|
|
|
41
44
|
processes reading the same store, and a key promoted before it lands there makes
|
|
42
45
|
one instance mint tokens the others report inactive.
|
|
43
46
|
|
|
44
|
-
Covers: identityService.keyStore, identityService.tokens -> identityService.keyStore
|
|
47
|
+
Covers: marketplace.identityService.keyStore, marketplace.identityService.tokens -> marketplace.identityService.keyStore
|
|
45
48
|
|
|
46
49
|
#### Scenario: A rotation keeps tokens minted a minute earlier verifiable
|
|
47
50
|
- **Given** the active key K1 and tokens issued under it with thirty minutes of life left
|
|
@@ -71,7 +74,7 @@ cache holds derived state only: losing it costs latency, never correctness, and
|
|
|
71
74
|
design where a cache miss can produce a *different verdict* is the bug this
|
|
72
75
|
requirement exists to prevent.
|
|
73
76
|
|
|
74
|
-
Covers: identityService.introspectionCache, identityService.tokens -> identityService.introspectionCache
|
|
77
|
+
Covers: marketplace.identityService.introspectionCache, marketplace.identityService.tokens -> marketplace.identityService.introspectionCache
|
|
75
78
|
|
|
76
79
|
#### Scenario: A revocation invalidates the cached verdict immediately
|
|
77
80
|
- **Given** a token whose active verdict is cached
|
|
@@ -1,30 +1,22 @@
|
|
|
1
|
-
//
|
|
2
|
-
//
|
|
1
|
+
// identity-service's own C4 — what is INSIDE the element the fleet map binds to
|
|
2
|
+
// services/platform/identity-service/: the containers behind the token API and
|
|
3
|
+
// the two stores they reach.
|
|
3
4
|
//
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
5
|
+
// An EXTENDING model. There is no `specification` block here and there must not
|
|
6
|
+
// be one: the kinds come from architecture/landscape.likec4, which is read as
|
|
7
|
+
// part of the SAME LikeC4 project (the root `likec4.config.json` excludes
|
|
8
|
+
// `**/node_modules/**` and `features/**`, and nothing under `services/`). A
|
|
9
|
+
// second declaration of a kind the map already declares is a duplicate error
|
|
10
|
+
// blamed on both files. `extend` takes the fully-qualified id the map minted —
|
|
11
|
+
// `marketplace.identityService` — because the element is nested in the
|
|
12
|
+
// `marketplace` group; `extend identityService` resolves to nothing.
|
|
13
|
+
//
|
|
14
|
+
// Where the service sits in the SUBSYSTEM tree changes none of this: the model
|
|
15
|
+
// is found by walking `services/`, and `services/platform/` is a grouping
|
|
16
|
+
// directory, never part of any id. SCHEMA.md, "Two shapes of a service model",
|
|
17
|
+
// has the standalone shape and the recipe for migrating a model to this one.
|
|
15
18
|
model {
|
|
16
|
-
identityService
|
|
17
|
-
description 'Issues the access tokens the rest of the fleet presents, and answers whether one is still good'
|
|
18
|
-
// The binding — not the title — is what ties this element to
|
|
19
|
-
// services/identity-service/. With a title alone, renaming the box to
|
|
20
|
-
// 'Identity' would silently stop every join that reads this file (health
|
|
21
|
-
// dependencies, `Covers:` entries, the landscape spine) while `loam
|
|
22
|
-
// validate` stayed green, because a title that fails to match is only a
|
|
23
|
-
// guess at a binding and is graded as one.
|
|
24
|
-
metadata {
|
|
25
|
-
service 'identity-service'
|
|
26
|
-
}
|
|
27
|
-
|
|
19
|
+
extend marketplace.identityService {
|
|
28
20
|
api = container 'api' {
|
|
29
21
|
description 'HTTP surface: POST /tokens, POST /tokens/introspect, GET /tokens/{token}/valid'
|
|
30
22
|
technology 'Go'
|
|
@@ -47,11 +39,15 @@ model {
|
|
|
47
39
|
// byte in here costs latency and never correctness, and ARCH-INTROSPECT-CACHE
|
|
48
40
|
// in arch.spec.md is the requirement that says so in a scenario.
|
|
49
41
|
//
|
|
50
|
-
// Both stores stay NESTED inside the service boundary
|
|
51
|
-
//
|
|
52
|
-
//
|
|
53
|
-
//
|
|
54
|
-
//
|
|
42
|
+
// Both stores stay NESTED inside the service boundary, and nothing makes
|
|
43
|
+
// them: loam grades neither placement, so lifting either into
|
|
44
|
+
// architecture/landscape.likec4 as a peer would earn no finding. They stay
|
|
45
|
+
// here because the extending shape makes it the cheapest default — an
|
|
46
|
+
// internal is written where the service is described, and nobody has to
|
|
47
|
+
// decide anything. The one consequence to know before choosing is about
|
|
48
|
+
// LikeC4 and not about taste: a second service's edge resolves only against
|
|
49
|
+
// a declaration the MAP holds, so a store somebody else will name goes up
|
|
50
|
+
// onto the landscape, inside `marketplace.identityService`.
|
|
55
51
|
introspectionCache = container 'introspection-cache' {
|
|
56
52
|
description 'Short-TTL introspection verdicts, keyed by token id'
|
|
57
53
|
technology 'Redis'
|
|
@@ -61,11 +57,12 @@ model {
|
|
|
61
57
|
// These three edges are the WHOLE runtime graph of this service:
|
|
62
58
|
// identity-service is the fleet's root of trust and calls nothing outside
|
|
63
59
|
// its own boundary, which is why health.yaml carries no `dependencies:`
|
|
64
|
-
// key
|
|
65
|
-
//
|
|
66
|
-
//
|
|
67
|
-
//
|
|
68
|
-
//
|
|
60
|
+
// key, and why this model draws no cross-boundary edge at all. They still
|
|
61
|
+
// have to be drawn — with four nested elements and no edge joining any of
|
|
62
|
+
// them this model is `c4.no-relationships`, on the grounds that parts which
|
|
63
|
+
// reach nothing are almost never the truth. (The check is evidence-gated:
|
|
64
|
+
// one lone container proves nothing and stays silent, which is why the
|
|
65
|
+
// warning is about a model this shape and not about any model.)
|
|
69
66
|
tokens -> keyStore 'Signs with the active key; rotation promotes the next; introspection reads keys and revocations back'
|
|
70
67
|
tokens -> introspectionCache 'Caches introspection verdicts, invalidates on revocation'
|
|
71
68
|
}
|
|
@@ -74,9 +71,10 @@ model {
|
|
|
74
71
|
// Views belong to LikeC4's renderer; no loam check reads anything below. One
|
|
75
72
|
// view is enough here because the whole model fits inside one boundary — the
|
|
76
73
|
// landscape splits its views only because a fleet-wide `include *` is the page
|
|
77
|
-
// nobody can read.
|
|
74
|
+
// nobody can read. View ids are flat across the whole project now that the map
|
|
75
|
+
// and every model share one, so this one is spelled to be unique.
|
|
78
76
|
views {
|
|
79
|
-
view identity_service of identityService {
|
|
77
|
+
view identity_service of marketplace.identityService {
|
|
80
78
|
title 'identity-service — containers'
|
|
81
79
|
include *
|
|
82
80
|
}
|
|
@@ -6,7 +6,8 @@
|
|
|
6
6
|
# `action: send|receive`, which is what makes a message's direction legible;
|
|
7
7
|
# 2.x spells the same thing as publish/subscribe under a channel, where the two
|
|
8
8
|
# words are ambiguous about whose perspective they take — and a 2.x document
|
|
9
|
-
#
|
|
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).
|
|
10
11
|
#
|
|
11
12
|
# The name is the spine: the landscape edge's `metadata { consumes }`, the
|
|
12
13
|
# requirement's `Consumes:` line and `name` below are one name spelled three
|
|
@@ -25,9 +25,14 @@ checks:
|
|
|
25
25
|
liveness: GET /internal/health/liveness
|
|
26
26
|
readiness: GET /internal/health/readiness # consumer group joined + both stores reachable
|
|
27
27
|
dependencies:
|
|
28
|
-
# Resolved against services/notification-service/model.likec4
|
|
29
|
-
#
|
|
30
|
-
#
|
|
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
|
|
31
36
|
# are nested inside the service element and share its lifecycle, so they are
|
|
32
37
|
# blast radius rather than dependency — identity-service's health.yaml states
|
|
33
38
|
# the same rule for its two stores.
|