@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,323 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The two post-build workflows, paired: the done-check (`loam-verify`) and the
|
|
3
|
+
* merge it precedes (`loam-ship`). One file for two commands because six
|
|
4
|
+
* workflows meet the five-file package cap somewhere, and this is the seam the
|
|
5
|
+
* cycle already has — both describe what happens after the code is built, and
|
|
6
|
+
* each body names the other's refusals (`record-federated`, `not-coherent`).
|
|
7
|
+
*/
|
|
8
|
+
export const LOAM_VERIFY = {
|
|
9
|
+
name: "loam-verify",
|
|
10
|
+
description: "Verify a built loam feature against its own promises, claim by claim, with evidence",
|
|
11
|
+
argumentHint: "<FEAT-id>",
|
|
12
|
+
purpose: "Check that the code somebody built is the feature that was designed. loam derives the questions; a test runner and you answer them. loam never reads the service, so a verdict is worth exactly what its evidence is worth.",
|
|
13
|
+
invocation: "loam instructions loam-verify $1",
|
|
14
|
+
placeholders: ["feature"],
|
|
15
|
+
spine: [
|
|
16
|
+
"`loam verify` — the checklist, derived from the feature's own artifacts",
|
|
17
|
+
"run the generated suite with a JSON report: the scenario claims are the runner's to answer, not yours",
|
|
18
|
+
"answer the remaining claims yourself, every one carrying a `file:line` that resolves",
|
|
19
|
+
"record from each affected service's own repository, bound to that service",
|
|
20
|
+
"read the verdict honestly — a scenario confirmed on your word is `attested`, not `verified`",
|
|
21
|
+
],
|
|
22
|
+
body: `Check that the code somebody just built is the feature that was designed.
|
|
23
|
+
|
|
24
|
+
loam derives the questions; the test runner and you answer them. loam never
|
|
25
|
+
reads the service, so a verdict is worth exactly what its evidence is worth.
|
|
26
|
+
|
|
27
|
+
1. \`loam verify $1 --json\`. \`claims[]\` is the checklist, derived from the feature's
|
|
28
|
+
own artifacts — one claim per new service, per operation its openapi delta adds,
|
|
29
|
+
per (direction, message) its asyncapi delta newly declares against the living
|
|
30
|
+
contract's send/receive sets (quotes and removals are never questions),
|
|
31
|
+
per tagged edge that names an operation, and per scenario of every changed
|
|
32
|
+
requirement, arch.spec.md deltas included. Each has a stable \`id\` and a
|
|
33
|
+
\`subject\` (the service whose code answers it); a claim that says arch.spec.md
|
|
34
|
+
wants an integration/ops test, not an acceptance test. An ARCHIVED feature returns its record as frozen history instead
|
|
35
|
+
(\`frozen: true\`) and \`--record\` / \`--results\` / \`--contract-results\` /
|
|
36
|
+
\`--diff-answers\` refuse it — \`loam unarchive\` first if the answers really
|
|
37
|
+
must change.
|
|
38
|
+
2. The \`scenario.tested\` claims are the runner's to answer, not yours. In the
|
|
39
|
+
service's repo, run the generated suite with a JSON report —
|
|
40
|
+
\`npx cucumber-js --format json:report.json\` (cucumber-jvm, behave,
|
|
41
|
+
SpecFlow/Reqnroll, pytest-bdd \`--cucumberjson\` and godog emit the same
|
|
42
|
+
format). The generated scenarios carry \`@loam-digest-…\` tags that ride into
|
|
43
|
+
the report; that digest is the match, and the run must have executed every
|
|
44
|
+
step of the stamped scenario, so never retitle or hand-edit a generated
|
|
45
|
+
scenario to make one pass. A runner with no cucumber formatter answers
|
|
46
|
+
through loam's runner-neutral shape instead, keyed by the same digests:
|
|
47
|
+
\`{"loamScenarioReport": 1, "results": [{"digest": "…", "status": "passed"}]}\`.
|
|
48
|
+
If there is no runnable suite yet you MAY answer them yourself, and the record
|
|
49
|
+
will say so: \`answered_by: agent\` makes the feature **attested**, not verified
|
|
50
|
+
(\`verified: false\`, \`verdict: "attested"\`, the \`verify.scenario-attested\`
|
|
51
|
+
notice, and a \`next.verify-attested\` step in \`loam status\`). Nothing gates on
|
|
52
|
+
it — a legacy service with no suite must still be able to ship — but say so
|
|
53
|
+
when you hand back, and close it with \`--results\` the moment a suite runs.
|
|
54
|
+
\`verify.digest-contested\` (warn) is the case where two services word a
|
|
55
|
+
scenario identically: they share one digest, so no single report can say whose
|
|
56
|
+
suite ran it, and each service must record its own with \`--service\`.
|
|
57
|
+
The \`api.exposes\` claims have a mechanical channel too, when an API
|
|
58
|
+
contract-test suite exists: emit loam's contract-results shape from its
|
|
59
|
+
report — \`{"loamContractReport": 1, "results": [{"operationId": "…",
|
|
60
|
+
"status": "passed"}]}\`, a one-line transform for Specmatic, Pact, Dredd or a
|
|
61
|
+
property harness — and pass \`--contract-results contract.json\` alongside.
|
|
62
|
+
Only a status of exactly \`passed\` confirms the named operation
|
|
63
|
+
(\`answered_by: external-runner\`); anything else, and an operation the report
|
|
64
|
+
never exercised, stays \`unconfirmed\` with the reason, and under the flag the
|
|
65
|
+
report owns every api.exposes claim, so take those out of the answers file.
|
|
66
|
+
3. Answer every OTHER claim by finding it in the code. Not by reasoning that it
|
|
67
|
+
must be there — by opening the file:
|
|
68
|
+
- \`service.exists\` — the service is deployable: its build, its entry point.
|
|
69
|
+
- \`api.exposes\` — the route handler serving that operationId, not the spec that
|
|
70
|
+
declares it — unless a contract-test report already answered it in step 2.
|
|
71
|
+
- \`event.declares\` — the code that puts the message on the wire (sends) or
|
|
72
|
+
handles it off the wire (receives), not the contract that names it.
|
|
73
|
+
- \`c4.calls\` — the call site in the CALLER.
|
|
74
|
+
4. Write those answers as JSON — evidence is \`file:line\`, one entry per place it can
|
|
75
|
+
be seen:
|
|
76
|
+
\`\`\`json
|
|
77
|
+
{ "answers": [
|
|
78
|
+
{ "id": "<claim id>", "verdict": "confirmed", "evidence": ["src/split/Api.ts:42"] },
|
|
79
|
+
{ "id": "<claim id>", "verdict": "unconfirmed", "note": "the split service has no entry point yet" }
|
|
80
|
+
] }
|
|
81
|
+
\`\`\`
|
|
82
|
+
5. Optional, before recording: cross-examine. Have a SECOND agent answer the
|
|
83
|
+
same checklist blind — a fresh context, given only \`loam verify $1 --json\`
|
|
84
|
+
and the code, never your answers file — then compare the two sets:
|
|
85
|
+
|
|
86
|
+
\`\`\`sh
|
|
87
|
+
loam verify $1 --diff-answers yours.json theirs.json --json
|
|
88
|
+
\`\`\`
|
|
89
|
+
|
|
90
|
+
Both files must answer EVERY claim in the compared scope,
|
|
91
|
+
\`scenario.tested\` included: the diff consults no test report, so this is a
|
|
92
|
+
DIFFERENT file from the one step 6 records under \`--results\` (that one
|
|
93
|
+
must omit the runner's claims; a step-6-shaped file here refuses
|
|
94
|
+
\`answers-mismatch\`). Narrowing with \`--service <id>\` compares one
|
|
95
|
+
service's claims — give the second agent the same lens, or its file will
|
|
96
|
+
not match the compared scope. An archived feature refuses the diff too:
|
|
97
|
+
frozen history has no current checklist. It writes nothing and changes no
|
|
98
|
+
verdict: \`cross.agree-confirmed\` / \`cross.agree-unconfirmed\` rows are the
|
|
99
|
+
cheap-to-skip queue, \`disagreements[]\` (\`cross.disagree\`) is what a human
|
|
100
|
+
reads first, and the \`cross.evidence-disjoint\` notice flags agreements
|
|
101
|
+
citing non-overlapping files — read those second. Agreement between two
|
|
102
|
+
same-model agents is correlated, so it ranks review; it never upgrades
|
|
103
|
+
\`attested\` to \`verified\`. Record only the answer set you stand behind, in
|
|
104
|
+
a separate run.
|
|
105
|
+
6. Record, **in each affected service's own repository**, one service at a time:
|
|
106
|
+
|
|
107
|
+
\`\`\`sh
|
|
108
|
+
loam verify $1 --service <id> --results report.json [--contract-results contract.json] --record answers.json --json
|
|
109
|
+
\`\`\`
|
|
110
|
+
|
|
111
|
+
\`--service <id>\` narrows the checklist to that service's claims and binds the
|
|
112
|
+
answers to this repository's commit, writing that service's attestation to
|
|
113
|
+
its OWN file, \`features/$1/verification/<id>.yaml\` — the directory is the
|
|
114
|
+
record, and loam adds the files up when it reads. Running it in the next repo
|
|
115
|
+
writes that repo's file and touches no other, so two teams' docs PRs never
|
|
116
|
+
conflict over the record. In a repo whose ./loam.json
|
|
117
|
+
declares a \`service\`, \`--service\` may be omitted — it is substituted, and the
|
|
118
|
+
run still federates. \`--results report.json\` alone is legal when the
|
|
119
|
+
checklist is all scenarios.
|
|
120
|
+
|
|
121
|
+
⚠ **Never run \`loam verify $1 --record answers.json\` without \`--service\`.**
|
|
122
|
+
That is the legacy all-at-once form: it writes the WHOLE record from one place,
|
|
123
|
+
into the one file \`verification.yaml\`, and over a record that already carries
|
|
124
|
+
other services' attestations it is refused (\`record-federated\`, naming them)
|
|
125
|
+
precisely because it would put one unattested answer set over them. If you
|
|
126
|
+
meet that refusal, re-run with \`--service\`; do not work around it.
|
|
127
|
+
|
|
128
|
+
The other refusals: \`answers-mismatch\` (an id
|
|
129
|
+
nobody asked about, a claim you left out — re-run step 1, the feature moved —
|
|
130
|
+
or an answers entry for a \`scenario.tested\` claim: the runner owns those),
|
|
131
|
+
\`answers-unevidenced\` (a \`confirmed\` with nothing behind it),
|
|
132
|
+
\`answers-unreadable\` (a report or answers file it cannot read),
|
|
133
|
+
\`record-unreadable\` (a record file that exists but cannot be read — broken
|
|
134
|
+
YAML, git conflict markers a merge left, or \`verify.record-miscounted\` when
|
|
135
|
+
its \`summary\` block contradicts its own \`claims[]\`. It is never overwritten,
|
|
136
|
+
and the message names the file and the safe repair: a service's own
|
|
137
|
+
\`verification/<id>.yaml\` holds only that service's word, so that service
|
|
138
|
+
may delete it and record again; the one-file \`verification.yaml\` may hold
|
|
139
|
+
other services' attestations, so it is repaired or restored from version
|
|
140
|
+
control — after a merge, the copy on the branch you merged into — and
|
|
141
|
+
**never deleted**. Never edit the counts to make them agree),
|
|
142
|
+
\`service-mismatch\` (\`--service\` names a service this repo does not declare) and
|
|
143
|
+
\`repository-unavailable\` (\`--service\` from a repo that declares none, or whose
|
|
144
|
+
commit cannot be read — an attestation must be bound to the code it is about).
|
|
145
|
+
7. Report every \`unconfirmed\` claim and what it would take to close it, and read
|
|
146
|
+
\`discarded\` in the payload: it names every previous answer the new record does
|
|
147
|
+
not carry, and each one is either evidence that went stale or evidence that was
|
|
148
|
+
just dropped. A scenario claim the report failed or missed closes by fixing the
|
|
149
|
+
code and re-running the suite — never by editing the generated .feature. While
|
|
150
|
+
any claim stays unconfirmed or unanswered, \`notices[]\` carries
|
|
151
|
+
\`verify.claims-open\` (warn, gating nothing): the one-line "not a clean
|
|
152
|
+
result" summary with all four counts, so a partial record can never read as a
|
|
153
|
+
finished one from the notice lines alone.
|
|
154
|
+
8. Reading is safe from anywhere: \`loam verify $1 --service <id> --json\` without
|
|
155
|
+
\`--record\` writes nothing and works from the docs repo too. \`services\` lists
|
|
156
|
+
every subject of the checklist, so it is how you find out which repos still
|
|
157
|
+
owe an attestation, and \`loam status $1 --json\` says the same thing in the
|
|
158
|
+
shape of a next step.
|
|
159
|
+
|
|
160
|
+
Anything you cannot show is \`unconfirmed\` with a note. That is a successful record,
|
|
161
|
+
and it is the useful one: nothing gates on this file, so the only thing it is for is
|
|
162
|
+
telling the next reader the truth. \`loam archive\` will ship the feature either way —
|
|
163
|
+
which is exactly why a \`confirmed\` you cannot back up costs nothing now and misleads
|
|
164
|
+
everyone later.
|
|
165
|
+
|
|
166
|
+
\`loam verify\` — the notice and record codes its reports carry in \`notices[]\`,
|
|
167
|
+
gathered from the steps above; branch on the code, never the prose:
|
|
168
|
+
|
|
169
|
+
| code | what it means | what to do |
|
|
170
|
+
|---|---|---|
|
|
171
|
+
| \`verify.claims-open\` (warn) | a recorded feature still has unconfirmed or unanswered claims — the one-line "not a clean result" summary with all four counts, so a partial record can never read as finished from the notice lines alone; a feature with no record at all never carries it | close each open claim: fix the code and re-run the suite for a failed scenario, re-answer the rest with evidence, then re-record |
|
|
172
|
+
| \`verify.scenario-attested\` (warn) | scenario claims were answered on an agent's word (\`answered_by: agent\`), so the verdict is **attested**, not verified — nothing gates on it, but say so when you hand back | run the generated suite with a JSON report and re-record with \`--results report.json\` the moment a suite exists |
|
|
173
|
+
| \`verify.digest-contested\` (warn) | two or more services word a scenario identically, so they share one \`@loam-digest-…\` tag and no single cucumber report can say whose suite ran it — those scenario claims stay unconfirmed | each service records its own claims from its own repository with \`--service <id>\` |
|
|
174
|
+
| \`verify.operation-contested\` (warn) | two services on the checklist expose the same operationId, so a contract report — which names no service — cannot say whose suite exercised it; those claims stay unconfirmed | each service records its own with \`--service <id>\`, passing its own contract report |
|
|
175
|
+
| \`verify.checklist-forked\` (warn) | one or more services answered a DIFFERENT version of the feature's question set than the one it now asks — each attestation carries the \`checklist\` digest it answered, and the notice names the ones that do not match the current checklist. Measured against the present, not pairwise: services that all attested against a since-rewritten delta agree with each other perfectly and are all stale. Normal mid-rollout, since services attest as they finish. Attestations written before the field existed carry no digest and are never called stale. In a per-service record the answers of the services named do not count until they record again | re-record the services on the older version from their own repositories (\`loam verify <FEAT> --service <id> --record\`) — nothing gates on it |
|
|
176
|
+
| \`verify.record-miscounted\` (error) | a record file whose \`summary\` block contradicts its own \`claims[]\` — neither half can be believed, so the record is refused as unreadable rather than trusted in either direction | a service's own \`verification/<id>.yaml\`: delete it and re-record from that service's repo; the one-file \`verification.yaml\`: restore it from version control, then re-record — never delete it, and never edit the counts by hand |
|
|
177
|
+
| \`verify.evidence-token-missing\` (warn) | a just-confirmed citation's file at the attested commit does not contain the claim's own token (the operationId, message name or edge op) — the evidence may not show what the answer says | re-read that evidence while the answer can still be corrected; verdict-neutral, it gates nothing |
|
|
178
|
+
| \`cross.agree-confirmed\` / \`cross.agree-unconfirmed\` (ok) | a \`--diff-answers\` row where both blind answer sets reach the same verdict — the cheap-to-skip review queue, though same-model agreement is correlated and proves nothing | nothing on its own; record only the answer set you stand behind, in a separate run |
|
|
179
|
+
| \`cross.disagree\` (the rows a human reads first) | a \`--diff-answers\` row where the two blind answer sets contradict each other — one of them is wrong about the code | read both cited evidences and decide; the diff writes nothing and never moves a verdict |
|
|
180
|
+
| \`cross.evidence-disjoint\` (warn) | a \`--diff-answers\` notice: claims BOTH sets confirm while citing non-overlapping files — two yeses that looked at different evidence | read those agreements second, after the disagreements; agreement over disjoint evidence is two guesses, not one proof |
|
|
181
|
+
`,
|
|
182
|
+
};
|
|
183
|
+
export const LOAM_SHIP = {
|
|
184
|
+
name: "loam-ship",
|
|
185
|
+
description: "Archive a finished loam feature — merge its deltas into the living docs",
|
|
186
|
+
argumentHint: "<FEAT-id>",
|
|
187
|
+
purpose: "Merge a shipped feature into the living specs, API and landscape. This is the one command that rewrites the source of truth, so every step before it exists to make the merge reviewable before it runs.",
|
|
188
|
+
invocation: "loam instructions loam-ship $1",
|
|
189
|
+
placeholders: ["feature"],
|
|
190
|
+
spine: [
|
|
191
|
+
"confirm the code is actually built and merged — archiving early makes the docs claim something that does not exist",
|
|
192
|
+
"`loam validate --feature $1` must come back valid; if it says nothing pinned the delta, rebase and re-validate first",
|
|
193
|
+
"`loam archive $1 --dry-run` — read the whole plan and every warning before the merge touches anything",
|
|
194
|
+
"`loam archive $1` for real, and read what it reports it did",
|
|
195
|
+
"every vouched spec on `revouchOwed[]` owes its owner's re-vouch — tell them; it lands in this same PR",
|
|
196
|
+
"`loam unarchive $1` is the undo if the plan turns out to have been wrong",
|
|
197
|
+
],
|
|
198
|
+
body: `Archive a shipped feature.
|
|
199
|
+
|
|
200
|
+
1. Confirm the code is actually built and merged. Archiving folds the delta into the
|
|
201
|
+
living docs; doing it early makes the docs claim something that does not exist.
|
|
202
|
+
\`loam status $1 --json\` answers "is this actually finished" in one call, and its
|
|
203
|
+
\`next[]\` names what is outstanding if it is not.
|
|
204
|
+
2. \`loam validate --feature $1 --json\` — must come back \`valid: true\`.
|
|
205
|
+
If it reports \`delta.baseline-missing\` or \`openapi.baseline-missing\`, run
|
|
206
|
+
\`loam rebase $1\` and re-validate BEFORE going on: those two say nothing has
|
|
207
|
+
pinned what this delta was written against, so the merge cannot tell the text
|
|
208
|
+
you EDITED from the text you merely restated. Both gate the archive — the
|
|
209
|
+
dry run in step 3 refuses on them too — and the only way past without the
|
|
210
|
+
pins is a human's \`--approve\`.
|
|
211
|
+
3. \`loam archive $1 --dry-run --json\` first. \`plan[]\` is every file the merge would
|
|
212
|
+
write (\`create\` / \`update\`, then the final \`move\` into \`features/archive/\`) —
|
|
213
|
+
including an \`update\` for each of the feature's own documents whose links the
|
|
214
|
+
move re-expresses, at its path before the move, and for each document outside
|
|
215
|
+
the feature (another feature in flight, a living ADR) whose links into it the
|
|
216
|
+
archive rewrites — and none of them are written —
|
|
217
|
+
read it before letting the merge touch the source of truth, and stop if a file
|
|
218
|
+
you did not expect is on it. \`warnings[]\` is what the
|
|
219
|
+
merge will do that is legal but lossy — advisory warnings never block, which is
|
|
220
|
+
exactly why you read them now: \`openapi.op-modified\` means an operation the living
|
|
221
|
+
contract already defines gets overwritten wholesale, and its \`details\` name the
|
|
222
|
+
current consumers that overwrite lands on (\`asyncapi.message-modified\` likewise for
|
|
223
|
+
a message; \`openapi.component-modified\` is the same story for a component the
|
|
224
|
+
merged operations carry, with no consumer list),
|
|
225
|
+
\`service.no-model\` means a service arrives on the map with no directory behind it
|
|
226
|
+
(an error, the one \`validate --all\` will report until \`loam adopt\` writes its
|
|
227
|
+
documents — it never blocks the merge, and the run prints it instead of claiming
|
|
228
|
+
the docs complete; a service whose directory the archive creates and the map
|
|
229
|
+
draws gets an empty extending model instead, and raises nothing), and
|
|
230
|
+
\`delta.added-conflict\`
|
|
231
|
+
means another feature in flight adds the same requirement — the first to archive
|
|
232
|
+
lands it, and the other's archive is then refused (\`delta.added-duplicate\`: its
|
|
233
|
+
ADDED now collides with the living spec) unless a human \`--approve\`s the
|
|
234
|
+
replacement. \`dropped[]\` is what each MODIFIED or REMOVED requirement takes OUT
|
|
235
|
+
of a living document — the scenarios and the \`Covers:\` / \`Operations:\` / … entries
|
|
236
|
+
its new text does not restate. None of it is a warning, and all of it is gone
|
|
237
|
+
after the merge: restate in the delta anything that must survive, then re-run.
|
|
238
|
+
The plan also prints one note per document the merge CREATES, saying whether
|
|
239
|
+
the delta's title and \`## Purpose\` came across. A created document with no
|
|
240
|
+
purpose arrives with no narrative at all. And read what lands verbatim — the
|
|
241
|
+
requirement bodies, scenarios and contract descriptions — for review-time
|
|
242
|
+
wording such as "this delta" or "this feature": in a living document it points
|
|
243
|
+
at a change nobody will remember. Fix both in the delta before the merge
|
|
244
|
+
(\`loam instructions loam-authoring\`, "Writing for a person").
|
|
245
|
+
4. \`loam archive $1 --json\`. It merges three axes into the living state — requirements
|
|
246
|
+
into \`services/<svc>/spec.md\`, endpoints into \`services/<svc>/openapi.yaml\`,
|
|
247
|
+
elements and edges into \`architecture/landscape.likec4\` and, for an addition nested
|
|
248
|
+
under a service whose model EXTENDS the map, into that
|
|
249
|
+
\`services/<…>/<svc>/model.likec4\` instead — a service the archive creates and
|
|
250
|
+
the merged map draws gets that model too, written empty at \`services/<svc>/model.likec4\` and holding
|
|
251
|
+
whatever the delta drew inside the service; it lands unfiled, and
|
|
252
|
+
\`loam subsystem move <svc> --into <subsystem>\` files it — then moves the feature
|
|
253
|
+
under \`features/archive/\`, whole: its verification record travels with it,
|
|
254
|
+
the per-service \`verification/<id>.yaml\` files and any one-file
|
|
255
|
+
\`verification.yaml\` alike, and \`loam verify $1\` reads it back afterwards as
|
|
256
|
+
frozen history. Verification never gates the archive — an open or missing
|
|
257
|
+
record ships as exactly that. Success is \`ok: true\`; on \`ok: false\`, branch on
|
|
258
|
+
\`error.code\`:
|
|
259
|
+
- \`not-coherent\` — gating coherence issues; \`issues[]\` in the envelope lists them,
|
|
260
|
+
each with \`gates\` and \`overridable\` resolved (advisory warnings do not block).
|
|
261
|
+
Fix the breaches. \`--approve\` overrides the gating issues and is a human's
|
|
262
|
+
call to make, not yours: report the breach and stop. Two codes it does not
|
|
263
|
+
override even then — \`delta.service-id-invalid\` (a \`specs/<svc>/\` name the
|
|
264
|
+
id grammar refuses) and \`c4.service-binding-invalid\` (a \`metadata { service }\`
|
|
265
|
+
binding it refuses, anywhere inside a tagged element's block): each names a
|
|
266
|
+
path the merge would write mechanically, they arrive with
|
|
267
|
+
\`overridable: false\`, and the fix is a rename, never the flag.
|
|
268
|
+
\`openapi.remove-marker-path-level\` arrives
|
|
269
|
+
here too: an \`x-loam-remove\` written beside the methods instead of inside the
|
|
270
|
+
operation retires nothing. So do \`openapi.op-revived\` and
|
|
271
|
+
\`asyncapi.slot-revived\`: the delta spells an operation, slot or message an
|
|
272
|
+
ARCHIVED feature retired, and the merge would put it back. If the delta only
|
|
273
|
+
quoted it, delete the quote; whether the feature brings it back on purpose is
|
|
274
|
+
the human's \`--approve\`, and the archive output then names what came back
|
|
275
|
+
and whose retirement it reverses.
|
|
276
|
+
- \`living-outside-requirements\` — the LIVING spec holds a requirement outside
|
|
277
|
+
\`## Requirements\`, and the merge would duplicate it. Re-home it, then re-run.
|
|
278
|
+
\`--approve\` does not move this one.
|
|
279
|
+
- \`archive-exists\` — \`features/archive/\` already has that directory; a human
|
|
280
|
+
decides what it is.
|
|
281
|
+
- \`merge-failed\` — the merge could not be computed, or failed and was rolled
|
|
282
|
+
back. Either way the living docs are unchanged; fix the reported cause, re-run.
|
|
283
|
+
"Could not resolve reference to RelationshipKind" means the delta draws a
|
|
284
|
+
relationship kind (\`-[publishes]->\`) that the living map's \`specification\`
|
|
285
|
+
does not declare: the archive copies the edge and never the declaration.
|
|
286
|
+
Declare the kind in \`architecture/landscape.likec4\` — it is vocabulary, not
|
|
287
|
+
a feature change — then re-run.
|
|
288
|
+
A file loam cannot decode as UTF-8 refuses here by name rather than being
|
|
289
|
+
rewritten with replacement characters. So does a living document that still
|
|
290
|
+
holds git conflict markers — the \`spec.merge-conflict\` /
|
|
291
|
+
\`landscape.merge-conflict\` findings ride in \`findings[]\`, and \`--approve\`
|
|
292
|
+
does not override them: the loss is mechanical, not a judgment call.
|
|
293
|
+
- \`docs-busy\` — another \`loam archive\` or \`loam unarchive\` holds the docs
|
|
294
|
+
repo's lock. Nothing was read or written; wait for it and re-run once.
|
|
295
|
+
- \`commit-interrupted\` — a previous archive or unarchive was killed mid-commit
|
|
296
|
+
and this run cannot repair it on its own: a half-written file was edited
|
|
297
|
+
since, its pre-image is gone or altered, or \`.loam-commit\` cannot be read.
|
|
298
|
+
Run \`loam doctor\` (\`doctor.commit-interrupted\` / \`doctor.commit-unreadable\`
|
|
299
|
+
name the same state) and hand it to a human — re-running does not help.
|
|
300
|
+
- \`rollback-incomplete\` — the merge failed AND some files could not be restored.
|
|
301
|
+
Stop and hand it to a human; the message lists the files to check.
|
|
302
|
+
5. Re-vouches are owed. \`revouchOwed[]\` — on the dry run and the real merge alike —
|
|
303
|
+
names every VOUCHED spec the merge moves under its vouch stamp, with the
|
|
304
|
+
document's \`owner\`. \`content.stale\` follows on each, and honestly: the merged
|
|
305
|
+
text is words nobody has yet read against the code. You cannot clear it — a
|
|
306
|
+
vouch is a person's, run in that service's own repo (\`loam vouch --service <id>\`,
|
|
307
|
+
after \`loam vouch --pack --service <id>\` for what to re-read). Name the
|
|
308
|
+
documents and owners in your hand-back, and say the re-vouches belong in the
|
|
309
|
+
SAME PR as this archive: a docs repo gated on
|
|
310
|
+
\`loam validate --all --base <ref> --strict\` keeps the archive's PR red until they
|
|
311
|
+
land. Never edit a stamp by hand to turn it green.
|
|
312
|
+
|
|
313
|
+
Archived by mistake? \`loam unarchive $1\` restores the living docs from the snapshot
|
|
314
|
+
archive left in \`features/archive/$1*/.loam-before/\` and re-opens the feature. Do not
|
|
315
|
+
hand-edit the living docs back instead: the previous text of a \`MODIFIED\` requirement
|
|
316
|
+
is in that snapshot and nowhere else, so anything you write by hand is a guess. It
|
|
317
|
+
refuses under \`snapshot-corrupt\` when a pre-image's bytes no longer match the digest
|
|
318
|
+
the archive recorded — \`--force\` does not override that one, because the damage is
|
|
319
|
+
to the undo itself — and under \`snapshot-missing\` for an archive older than the
|
|
320
|
+
current snapshot format. Both mean version control is the way back.
|
|
321
|
+
`,
|
|
322
|
+
};
|
|
323
|
+
//# sourceMappingURL=closing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"closing.js","sourceRoot":"","sources":["../../../../src/core/agent/workflows/closing.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,WAAW,GAAmB;IACzC,IAAI,EAAE,aAAa;IACnB,WAAW,EACT,qFAAqF;IACvF,YAAY,EAAE,WAAW;IACzB,OAAO,EACL,6NAA6N;IAC/N,UAAU,EAAE,kCAAkC;IAC9C,YAAY,EAAE,CAAC,SAAS,CAAC;IACzB,KAAK,EAAE;QACL,yEAAyE;QACzE,uGAAuG;QACvG,sFAAsF;QACtF,2EAA2E;QAC3E,6FAA6F;KAC9F;IACD,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+JP;CACA,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAmB;IACvC,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,yEAAyE;IACtF,YAAY,EAAE,WAAW;IACzB,OAAO,EACL,0MAA0M;IAC5M,UAAU,EAAE,gCAAgC;IAC5C,YAAY,EAAE,CAAC,SAAS,CAAC;IACzB,KAAK,EAAE;QACL,oHAAoH;QACpH,sHAAsH;QACtH,uGAAuG;QACvG,6DAA6D;QAC7D,uGAAuG;QACvG,0EAA0E;KAC3E;IACD,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2HP;CACA,CAAC","sourcesContent":["import type { CommandContent } from \"../contract.js\";\n\n/**\n * The two post-build workflows, paired: the done-check (`loam-verify`) and the\n * merge it precedes (`loam-ship`). One file for two commands because six\n * workflows meet the five-file package cap somewhere, and this is the seam the\n * cycle already has — both describe what happens after the code is built, and\n * each body names the other's refusals (`record-federated`, `not-coherent`).\n */\nexport const LOAM_VERIFY: CommandContent = {\n name: \"loam-verify\",\n description:\n \"Verify a built loam feature against its own promises, claim by claim, with evidence\",\n argumentHint: \"<FEAT-id>\",\n purpose:\n \"Check that the code somebody built is the feature that was designed. loam derives the questions; a test runner and you answer them. loam never reads the service, so a verdict is worth exactly what its evidence is worth.\",\n invocation: \"loam instructions loam-verify $1\",\n placeholders: [\"feature\"],\n spine: [\n \"`loam verify` — the checklist, derived from the feature's own artifacts\",\n \"run the generated suite with a JSON report: the scenario claims are the runner's to answer, not yours\",\n \"answer the remaining claims yourself, every one carrying a `file:line` that resolves\",\n \"record from each affected service's own repository, bound to that service\",\n \"read the verdict honestly — a scenario confirmed on your word is `attested`, not `verified`\",\n ],\n body: `Check that the code somebody just built is the feature that was designed.\n\nloam derives the questions; the test runner and you answer them. loam never\nreads the service, so a verdict is worth exactly what its evidence is worth.\n\n1. \\`loam verify $1 --json\\`. \\`claims[]\\` is the checklist, derived from the feature's\n own artifacts — one claim per new service, per operation its openapi delta adds,\n per (direction, message) its asyncapi delta newly declares against the living\n contract's send/receive sets (quotes and removals are never questions),\n per tagged edge that names an operation, and per scenario of every changed\n requirement, arch.spec.md deltas included. Each has a stable \\`id\\` and a\n \\`subject\\` (the service whose code answers it); a claim that says arch.spec.md\n wants an integration/ops test, not an acceptance test. An ARCHIVED feature returns its record as frozen history instead\n (\\`frozen: true\\`) and \\`--record\\` / \\`--results\\` / \\`--contract-results\\` /\n \\`--diff-answers\\` refuse it — \\`loam unarchive\\` first if the answers really\n must change.\n2. The \\`scenario.tested\\` claims are the runner's to answer, not yours. In the\n service's repo, run the generated suite with a JSON report —\n \\`npx cucumber-js --format json:report.json\\` (cucumber-jvm, behave,\n SpecFlow/Reqnroll, pytest-bdd \\`--cucumberjson\\` and godog emit the same\n format). The generated scenarios carry \\`@loam-digest-…\\` tags that ride into\n the report; that digest is the match, and the run must have executed every\n step of the stamped scenario, so never retitle or hand-edit a generated\n scenario to make one pass. A runner with no cucumber formatter answers\n through loam's runner-neutral shape instead, keyed by the same digests:\n \\`{\"loamScenarioReport\": 1, \"results\": [{\"digest\": \"…\", \"status\": \"passed\"}]}\\`.\n If there is no runnable suite yet you MAY answer them yourself, and the record\n will say so: \\`answered_by: agent\\` makes the feature **attested**, not verified\n (\\`verified: false\\`, \\`verdict: \"attested\"\\`, the \\`verify.scenario-attested\\`\n notice, and a \\`next.verify-attested\\` step in \\`loam status\\`). Nothing gates on\n it — a legacy service with no suite must still be able to ship — but say so\n when you hand back, and close it with \\`--results\\` the moment a suite runs.\n \\`verify.digest-contested\\` (warn) is the case where two services word a\n scenario identically: they share one digest, so no single report can say whose\n suite ran it, and each service must record its own with \\`--service\\`.\n The \\`api.exposes\\` claims have a mechanical channel too, when an API\n contract-test suite exists: emit loam's contract-results shape from its\n report — \\`{\"loamContractReport\": 1, \"results\": [{\"operationId\": \"…\",\n \"status\": \"passed\"}]}\\`, a one-line transform for Specmatic, Pact, Dredd or a\n property harness — and pass \\`--contract-results contract.json\\` alongside.\n Only a status of exactly \\`passed\\` confirms the named operation\n (\\`answered_by: external-runner\\`); anything else, and an operation the report\n never exercised, stays \\`unconfirmed\\` with the reason, and under the flag the\n report owns every api.exposes claim, so take those out of the answers file.\n3. Answer every OTHER claim by finding it in the code. Not by reasoning that it\n must be there — by opening the file:\n - \\`service.exists\\` — the service is deployable: its build, its entry point.\n - \\`api.exposes\\` — the route handler serving that operationId, not the spec that\n declares it — unless a contract-test report already answered it in step 2.\n - \\`event.declares\\` — the code that puts the message on the wire (sends) or\n handles it off the wire (receives), not the contract that names it.\n - \\`c4.calls\\` — the call site in the CALLER.\n4. Write those answers as JSON — evidence is \\`file:line\\`, one entry per place it can\n be seen:\n \\`\\`\\`json\n { \"answers\": [\n { \"id\": \"<claim id>\", \"verdict\": \"confirmed\", \"evidence\": [\"src/split/Api.ts:42\"] },\n { \"id\": \"<claim id>\", \"verdict\": \"unconfirmed\", \"note\": \"the split service has no entry point yet\" }\n ] }\n \\`\\`\\`\n5. Optional, before recording: cross-examine. Have a SECOND agent answer the\n same checklist blind — a fresh context, given only \\`loam verify $1 --json\\`\n and the code, never your answers file — then compare the two sets:\n\n \\`\\`\\`sh\n loam verify $1 --diff-answers yours.json theirs.json --json\n \\`\\`\\`\n\n Both files must answer EVERY claim in the compared scope,\n \\`scenario.tested\\` included: the diff consults no test report, so this is a\n DIFFERENT file from the one step 6 records under \\`--results\\` (that one\n must omit the runner's claims; a step-6-shaped file here refuses\n \\`answers-mismatch\\`). Narrowing with \\`--service <id>\\` compares one\n service's claims — give the second agent the same lens, or its file will\n not match the compared scope. An archived feature refuses the diff too:\n frozen history has no current checklist. It writes nothing and changes no\n verdict: \\`cross.agree-confirmed\\` / \\`cross.agree-unconfirmed\\` rows are the\n cheap-to-skip queue, \\`disagreements[]\\` (\\`cross.disagree\\`) is what a human\n reads first, and the \\`cross.evidence-disjoint\\` notice flags agreements\n citing non-overlapping files — read those second. Agreement between two\n same-model agents is correlated, so it ranks review; it never upgrades\n \\`attested\\` to \\`verified\\`. Record only the answer set you stand behind, in\n a separate run.\n6. Record, **in each affected service's own repository**, one service at a time:\n\n \\`\\`\\`sh\n loam verify $1 --service <id> --results report.json [--contract-results contract.json] --record answers.json --json\n \\`\\`\\`\n\n \\`--service <id>\\` narrows the checklist to that service's claims and binds the\n answers to this repository's commit, writing that service's attestation to\n its OWN file, \\`features/$1/verification/<id>.yaml\\` — the directory is the\n record, and loam adds the files up when it reads. Running it in the next repo\n writes that repo's file and touches no other, so two teams' docs PRs never\n conflict over the record. In a repo whose ./loam.json\n declares a \\`service\\`, \\`--service\\` may be omitted — it is substituted, and the\n run still federates. \\`--results report.json\\` alone is legal when the\n checklist is all scenarios.\n\n ⚠ **Never run \\`loam verify $1 --record answers.json\\` without \\`--service\\`.**\n That is the legacy all-at-once form: it writes the WHOLE record from one place,\n into the one file \\`verification.yaml\\`, and over a record that already carries\n other services' attestations it is refused (\\`record-federated\\`, naming them)\n precisely because it would put one unattested answer set over them. If you\n meet that refusal, re-run with \\`--service\\`; do not work around it.\n\n The other refusals: \\`answers-mismatch\\` (an id\n nobody asked about, a claim you left out — re-run step 1, the feature moved —\n or an answers entry for a \\`scenario.tested\\` claim: the runner owns those),\n \\`answers-unevidenced\\` (a \\`confirmed\\` with nothing behind it),\n \\`answers-unreadable\\` (a report or answers file it cannot read),\n \\`record-unreadable\\` (a record file that exists but cannot be read — broken\n YAML, git conflict markers a merge left, or \\`verify.record-miscounted\\` when\n its \\`summary\\` block contradicts its own \\`claims[]\\`. It is never overwritten,\n and the message names the file and the safe repair: a service's own\n \\`verification/<id>.yaml\\` holds only that service's word, so that service\n may delete it and record again; the one-file \\`verification.yaml\\` may hold\n other services' attestations, so it is repaired or restored from version\n control — after a merge, the copy on the branch you merged into — and\n **never deleted**. Never edit the counts to make them agree),\n \\`service-mismatch\\` (\\`--service\\` names a service this repo does not declare) and\n \\`repository-unavailable\\` (\\`--service\\` from a repo that declares none, or whose\n commit cannot be read — an attestation must be bound to the code it is about).\n7. Report every \\`unconfirmed\\` claim and what it would take to close it, and read\n \\`discarded\\` in the payload: it names every previous answer the new record does\n not carry, and each one is either evidence that went stale or evidence that was\n just dropped. A scenario claim the report failed or missed closes by fixing the\n code and re-running the suite — never by editing the generated .feature. While\n any claim stays unconfirmed or unanswered, \\`notices[]\\` carries\n \\`verify.claims-open\\` (warn, gating nothing): the one-line \"not a clean\n result\" summary with all four counts, so a partial record can never read as a\n finished one from the notice lines alone.\n8. Reading is safe from anywhere: \\`loam verify $1 --service <id> --json\\` without\n \\`--record\\` writes nothing and works from the docs repo too. \\`services\\` lists\n every subject of the checklist, so it is how you find out which repos still\n owe an attestation, and \\`loam status $1 --json\\` says the same thing in the\n shape of a next step.\n\nAnything you cannot show is \\`unconfirmed\\` with a note. That is a successful record,\nand it is the useful one: nothing gates on this file, so the only thing it is for is\ntelling the next reader the truth. \\`loam archive\\` will ship the feature either way —\nwhich is exactly why a \\`confirmed\\` you cannot back up costs nothing now and misleads\neveryone later.\n\n\\`loam verify\\` — the notice and record codes its reports carry in \\`notices[]\\`,\ngathered from the steps above; branch on the code, never the prose:\n\n| code | what it means | what to do |\n|---|---|---|\n| \\`verify.claims-open\\` (warn) | a recorded feature still has unconfirmed or unanswered claims — the one-line \"not a clean result\" summary with all four counts, so a partial record can never read as finished from the notice lines alone; a feature with no record at all never carries it | close each open claim: fix the code and re-run the suite for a failed scenario, re-answer the rest with evidence, then re-record |\n| \\`verify.scenario-attested\\` (warn) | scenario claims were answered on an agent's word (\\`answered_by: agent\\`), so the verdict is **attested**, not verified — nothing gates on it, but say so when you hand back | run the generated suite with a JSON report and re-record with \\`--results report.json\\` the moment a suite exists |\n| \\`verify.digest-contested\\` (warn) | two or more services word a scenario identically, so they share one \\`@loam-digest-…\\` tag and no single cucumber report can say whose suite ran it — those scenario claims stay unconfirmed | each service records its own claims from its own repository with \\`--service <id>\\` |\n| \\`verify.operation-contested\\` (warn) | two services on the checklist expose the same operationId, so a contract report — which names no service — cannot say whose suite exercised it; those claims stay unconfirmed | each service records its own with \\`--service <id>\\`, passing its own contract report |\n| \\`verify.checklist-forked\\` (warn) | one or more services answered a DIFFERENT version of the feature's question set than the one it now asks — each attestation carries the \\`checklist\\` digest it answered, and the notice names the ones that do not match the current checklist. Measured against the present, not pairwise: services that all attested against a since-rewritten delta agree with each other perfectly and are all stale. Normal mid-rollout, since services attest as they finish. Attestations written before the field existed carry no digest and are never called stale. In a per-service record the answers of the services named do not count until they record again | re-record the services on the older version from their own repositories (\\`loam verify <FEAT> --service <id> --record\\`) — nothing gates on it |\n| \\`verify.record-miscounted\\` (error) | a record file whose \\`summary\\` block contradicts its own \\`claims[]\\` — neither half can be believed, so the record is refused as unreadable rather than trusted in either direction | a service's own \\`verification/<id>.yaml\\`: delete it and re-record from that service's repo; the one-file \\`verification.yaml\\`: restore it from version control, then re-record — never delete it, and never edit the counts by hand |\n| \\`verify.evidence-token-missing\\` (warn) | a just-confirmed citation's file at the attested commit does not contain the claim's own token (the operationId, message name or edge op) — the evidence may not show what the answer says | re-read that evidence while the answer can still be corrected; verdict-neutral, it gates nothing |\n| \\`cross.agree-confirmed\\` / \\`cross.agree-unconfirmed\\` (ok) | a \\`--diff-answers\\` row where both blind answer sets reach the same verdict — the cheap-to-skip review queue, though same-model agreement is correlated and proves nothing | nothing on its own; record only the answer set you stand behind, in a separate run |\n| \\`cross.disagree\\` (the rows a human reads first) | a \\`--diff-answers\\` row where the two blind answer sets contradict each other — one of them is wrong about the code | read both cited evidences and decide; the diff writes nothing and never moves a verdict |\n| \\`cross.evidence-disjoint\\` (warn) | a \\`--diff-answers\\` notice: claims BOTH sets confirm while citing non-overlapping files — two yeses that looked at different evidence | read those agreements second, after the disagreements; agreement over disjoint evidence is two guesses, not one proof |\n`,\n};\n\nexport const LOAM_SHIP: CommandContent = {\n name: \"loam-ship\",\n description: \"Archive a finished loam feature — merge its deltas into the living docs\",\n argumentHint: \"<FEAT-id>\",\n purpose:\n \"Merge a shipped feature into the living specs, API and landscape. This is the one command that rewrites the source of truth, so every step before it exists to make the merge reviewable before it runs.\",\n invocation: \"loam instructions loam-ship $1\",\n placeholders: [\"feature\"],\n spine: [\n \"confirm the code is actually built and merged — archiving early makes the docs claim something that does not exist\",\n \"`loam validate --feature $1` must come back valid; if it says nothing pinned the delta, rebase and re-validate first\",\n \"`loam archive $1 --dry-run` — read the whole plan and every warning before the merge touches anything\",\n \"`loam archive $1` for real, and read what it reports it did\",\n \"every vouched spec on `revouchOwed[]` owes its owner's re-vouch — tell them; it lands in this same PR\",\n \"`loam unarchive $1` is the undo if the plan turns out to have been wrong\",\n ],\n body: `Archive a shipped feature.\n\n1. Confirm the code is actually built and merged. Archiving folds the delta into the\n living docs; doing it early makes the docs claim something that does not exist.\n \\`loam status $1 --json\\` answers \"is this actually finished\" in one call, and its\n \\`next[]\\` names what is outstanding if it is not.\n2. \\`loam validate --feature $1 --json\\` — must come back \\`valid: true\\`.\n If it reports \\`delta.baseline-missing\\` or \\`openapi.baseline-missing\\`, run\n \\`loam rebase $1\\` and re-validate BEFORE going on: those two say nothing has\n pinned what this delta was written against, so the merge cannot tell the text\n you EDITED from the text you merely restated. Both gate the archive — the\n dry run in step 3 refuses on them too — and the only way past without the\n pins is a human's \\`--approve\\`.\n3. \\`loam archive $1 --dry-run --json\\` first. \\`plan[]\\` is every file the merge would\n write (\\`create\\` / \\`update\\`, then the final \\`move\\` into \\`features/archive/\\`) —\n including an \\`update\\` for each of the feature's own documents whose links the\n move re-expresses, at its path before the move, and for each document outside\n the feature (another feature in flight, a living ADR) whose links into it the\n archive rewrites — and none of them are written —\n read it before letting the merge touch the source of truth, and stop if a file\n you did not expect is on it. \\`warnings[]\\` is what the\n merge will do that is legal but lossy — advisory warnings never block, which is\n exactly why you read them now: \\`openapi.op-modified\\` means an operation the living\n contract already defines gets overwritten wholesale, and its \\`details\\` name the\n current consumers that overwrite lands on (\\`asyncapi.message-modified\\` likewise for\n a message; \\`openapi.component-modified\\` is the same story for a component the\n merged operations carry, with no consumer list),\n \\`service.no-model\\` means a service arrives on the map with no directory behind it\n (an error, the one \\`validate --all\\` will report until \\`loam adopt\\` writes its\n documents — it never blocks the merge, and the run prints it instead of claiming\n the docs complete; a service whose directory the archive creates and the map\n draws gets an empty extending model instead, and raises nothing), and\n \\`delta.added-conflict\\`\n means another feature in flight adds the same requirement — the first to archive\n lands it, and the other's archive is then refused (\\`delta.added-duplicate\\`: its\n ADDED now collides with the living spec) unless a human \\`--approve\\`s the\n replacement. \\`dropped[]\\` is what each MODIFIED or REMOVED requirement takes OUT\n of a living document — the scenarios and the \\`Covers:\\` / \\`Operations:\\` / … entries\n its new text does not restate. None of it is a warning, and all of it is gone\n after the merge: restate in the delta anything that must survive, then re-run.\n The plan also prints one note per document the merge CREATES, saying whether\n the delta's title and \\`## Purpose\\` came across. A created document with no\n purpose arrives with no narrative at all. And read what lands verbatim — the\n requirement bodies, scenarios and contract descriptions — for review-time\n wording such as \"this delta\" or \"this feature\": in a living document it points\n at a change nobody will remember. Fix both in the delta before the merge\n (\\`loam instructions loam-authoring\\`, \"Writing for a person\").\n4. \\`loam archive $1 --json\\`. It merges three axes into the living state — requirements\n into \\`services/<svc>/spec.md\\`, endpoints into \\`services/<svc>/openapi.yaml\\`,\n elements and edges into \\`architecture/landscape.likec4\\` and, for an addition nested\n under a service whose model EXTENDS the map, into that\n \\`services/<…>/<svc>/model.likec4\\` instead — a service the archive creates and\n the merged map draws gets that model too, written empty at \\`services/<svc>/model.likec4\\` and holding\n whatever the delta drew inside the service; it lands unfiled, and\n \\`loam subsystem move <svc> --into <subsystem>\\` files it — then moves the feature\n under \\`features/archive/\\`, whole: its verification record travels with it,\n the per-service \\`verification/<id>.yaml\\` files and any one-file\n \\`verification.yaml\\` alike, and \\`loam verify $1\\` reads it back afterwards as\n frozen history. Verification never gates the archive — an open or missing\n record ships as exactly that. Success is \\`ok: true\\`; on \\`ok: false\\`, branch on\n \\`error.code\\`:\n - \\`not-coherent\\` — gating coherence issues; \\`issues[]\\` in the envelope lists them,\n each with \\`gates\\` and \\`overridable\\` resolved (advisory warnings do not block).\n Fix the breaches. \\`--approve\\` overrides the gating issues and is a human's\n call to make, not yours: report the breach and stop. Two codes it does not\n override even then — \\`delta.service-id-invalid\\` (a \\`specs/<svc>/\\` name the\n id grammar refuses) and \\`c4.service-binding-invalid\\` (a \\`metadata { service }\\`\n binding it refuses, anywhere inside a tagged element's block): each names a\n path the merge would write mechanically, they arrive with\n \\`overridable: false\\`, and the fix is a rename, never the flag.\n \\`openapi.remove-marker-path-level\\` arrives\n here too: an \\`x-loam-remove\\` written beside the methods instead of inside the\n operation retires nothing. So do \\`openapi.op-revived\\` and\n \\`asyncapi.slot-revived\\`: the delta spells an operation, slot or message an\n ARCHIVED feature retired, and the merge would put it back. If the delta only\n quoted it, delete the quote; whether the feature brings it back on purpose is\n the human's \\`--approve\\`, and the archive output then names what came back\n and whose retirement it reverses.\n - \\`living-outside-requirements\\` — the LIVING spec holds a requirement outside\n \\`## Requirements\\`, and the merge would duplicate it. Re-home it, then re-run.\n \\`--approve\\` does not move this one.\n - \\`archive-exists\\` — \\`features/archive/\\` already has that directory; a human\n decides what it is.\n - \\`merge-failed\\` — the merge could not be computed, or failed and was rolled\n back. Either way the living docs are unchanged; fix the reported cause, re-run.\n \"Could not resolve reference to RelationshipKind\" means the delta draws a\n relationship kind (\\`-[publishes]->\\`) that the living map's \\`specification\\`\n does not declare: the archive copies the edge and never the declaration.\n Declare the kind in \\`architecture/landscape.likec4\\` — it is vocabulary, not\n a feature change — then re-run.\n A file loam cannot decode as UTF-8 refuses here by name rather than being\n rewritten with replacement characters. So does a living document that still\n holds git conflict markers — the \\`spec.merge-conflict\\` /\n \\`landscape.merge-conflict\\` findings ride in \\`findings[]\\`, and \\`--approve\\`\n does not override them: the loss is mechanical, not a judgment call.\n - \\`docs-busy\\` — another \\`loam archive\\` or \\`loam unarchive\\` holds the docs\n repo's lock. Nothing was read or written; wait for it and re-run once.\n - \\`commit-interrupted\\` — a previous archive or unarchive was killed mid-commit\n and this run cannot repair it on its own: a half-written file was edited\n since, its pre-image is gone or altered, or \\`.loam-commit\\` cannot be read.\n Run \\`loam doctor\\` (\\`doctor.commit-interrupted\\` / \\`doctor.commit-unreadable\\`\n name the same state) and hand it to a human — re-running does not help.\n - \\`rollback-incomplete\\` — the merge failed AND some files could not be restored.\n Stop and hand it to a human; the message lists the files to check.\n5. Re-vouches are owed. \\`revouchOwed[]\\` — on the dry run and the real merge alike —\n names every VOUCHED spec the merge moves under its vouch stamp, with the\n document's \\`owner\\`. \\`content.stale\\` follows on each, and honestly: the merged\n text is words nobody has yet read against the code. You cannot clear it — a\n vouch is a person's, run in that service's own repo (\\`loam vouch --service <id>\\`,\n after \\`loam vouch --pack --service <id>\\` for what to re-read). Name the\n documents and owners in your hand-back, and say the re-vouches belong in the\n SAME PR as this archive: a docs repo gated on\n \\`loam validate --all --base <ref> --strict\\` keeps the archive's PR red until they\n land. Never edit a stamp by hand to turn it green.\n\nArchived by mistake? \\`loam unarchive $1\\` restores the living docs from the snapshot\narchive left in \\`features/archive/$1*/.loam-before/\\` and re-opens the feature. Do not\nhand-edit the living docs back instead: the previous text of a \\`MODIFIED\\` requirement\nis in that snapshot and nowhere else, so anything you write by hand is a guess. It\nrefuses under \\`snapshot-corrupt\\` when a pre-image's bytes no longer match the digest\nthe archive recorded — \\`--force\\` does not override that one, because the damage is\nto the undo itself — and under \\`snapshot-missing\\` for an archive older than the\ncurrent snapshot format. Both mean version control is the way back.\n`,\n};\n"]}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
/** Starting a feature: explore, scaffold, author the three axes, rebase, validate. */
|
|
2
|
+
export const LOAM_FEATURE = {
|
|
3
|
+
name: "loam-feature",
|
|
4
|
+
description: "Start a new loam feature — scaffold it, then author the C4 delta and requirement deltas",
|
|
5
|
+
argumentHint: `<FEAT-id> "<title>"`,
|
|
6
|
+
purpose: "Start a feature in the docs repo: decide which services it touches, scaffold it, then author the C4 delta and one requirement delta per service. The `--touches` list is the hardest call in the cycle and nothing downstream catches one that is short by a service.",
|
|
7
|
+
invocation: 'loam instructions loam-feature $1 "$2"',
|
|
8
|
+
// $2 is the feature's human title: any string is a legal one.
|
|
9
|
+
placeholders: ["feature", "free"],
|
|
10
|
+
spine: [
|
|
11
|
+
"decide whether this is a feature at all — a change that touches no requirement, operation or edge needs none",
|
|
12
|
+
"read `AGENTS.md` at the docs repo root — it defines the ID spine everything else depends on",
|
|
13
|
+
"`loam explore` around the services you think are involved: the ring one hop out, and what is already in flight over the same ground",
|
|
14
|
+
"`loam status` / `loam list` / `loam show` — what exists and what is already owed",
|
|
15
|
+
"`loam new` with a `--touches` per service it changes and a `--new-service` per service it introduces",
|
|
16
|
+
"author what the templates left as TODO: intent, the C4 delta, the per-service spec / arch spec / openapi",
|
|
17
|
+
"analyze before you pin — write what the documents leave open under `## Open questions` in intent.md, for a human to answer",
|
|
18
|
+
"`loam rebase` — pin every MODIFIED requirement and every living operation you edited to the version you wrote against",
|
|
19
|
+
"validate the feature, then read `loam dependencies` before anyone starts building",
|
|
20
|
+
],
|
|
21
|
+
// Step 0 and step 4b are the two this protocol was missing, and neither is
|
|
22
|
+
// graded — on purpose. Step 0 exists because the lightest lane loam has (no
|
|
23
|
+
// feature at all, for a change that moves no requirement, operation or edge)
|
|
24
|
+
// was true and written down nowhere, so the work that is most of a legacy
|
|
25
|
+
// fleet's week either walked the whole feature cycle or routed around loam.
|
|
26
|
+
// Step 4b exists because every check after it is a join between exact
|
|
27
|
+
// tokens: two services that agree on every operationId and disagree on what
|
|
28
|
+
// it means (one confirms a split the other answers 422 for) validate, archive
|
|
29
|
+
// and ship green, and a `Realizes:` whose requirement does not deliver the
|
|
30
|
+
// promise reads as a clean join. Nothing in the binary can read meaning, and
|
|
31
|
+
// a check pretending to would be the false green this tool exists to refuse,
|
|
32
|
+
// so the step asks for questions and leaves the answers to a person.
|
|
33
|
+
body: `Start a new feature in the loam docs repo (its path is \`docsDir\` in ./loam.json).
|
|
34
|
+
|
|
35
|
+
0. First decide whether this needs a feature at all. A change that touches no
|
|
36
|
+
requirement, no operation and no fleet edge — a refactor, a dependency bump,
|
|
37
|
+
a fix that brings the code back to behaviour the living spec already
|
|
38
|
+
documents — needs NONE: nothing in the docs repo changes, so there is nothing
|
|
39
|
+
to scaffold, pin or archive. It is a code PR in the service repo, then
|
|
40
|
+
\`loam validate --service <id>\` there (the service repo is the only place
|
|
41
|
+
\`sources.stale\` is visible), then \`loam vouch --pack --service <id>\` to
|
|
42
|
+
prepare the re-read the moved sources owe — the vouch itself is a human's.
|
|
43
|
+
If the change alters what a requirement promises, it IS a feature, however
|
|
44
|
+
small: one \`--touches\`, a Why, the ADDED/MODIFIED requirement, and
|
|
45
|
+
\`loam rebase\` for a MODIFIED one — the rest of this page still applies.
|
|
46
|
+
1. Read \`AGENTS.md\` at the root of the docs repo first — it defines the ID spine
|
|
47
|
+
everything here depends on.
|
|
48
|
+
2. Understand the current state before proposing a change:
|
|
49
|
+
- \`loam status --json\` — what is already in flight and what it is waiting on.
|
|
50
|
+
Run this FIRST if you joined this repository halfway or lost the session:
|
|
51
|
+
\`next[]\` is ordered and each entry carries the literal command to run, so it
|
|
52
|
+
tells you whether the work is to start $1 at all. \`loam status $1 --json\`
|
|
53
|
+
narrows it to one feature once $1 exists
|
|
54
|
+
- \`loam list --json\` — what services exist, and what documentation they are missing
|
|
55
|
+
- \`loam show <service> --json\` — what a service owns, exposes, and who already calls it
|
|
56
|
+
2b. \`loam explore <service> --json --as $1\` around every service you believe this
|
|
57
|
+
feature touches. This is the step that decides step 3's \`--touches\` list, and it
|
|
58
|
+
is the only decision in the cycle nothing downstream catches — a list short by one
|
|
59
|
+
service produces a feature that validates, archives and ships with a consumer
|
|
60
|
+
nobody updated. Read four fields:
|
|
61
|
+
- \`neighbours\` — the services one hop out in the fleet map. Weigh each one. loam
|
|
62
|
+
knows they are connected, not whether you change them, and it deliberately
|
|
63
|
+
leaves them OUT of the suggested command line rather than guessing for you
|
|
64
|
+
- \`services[].maturity\` — a service at \`empty\` or \`partial\` has no baseline to
|
|
65
|
+
write a delta against, so the work starts with \`loam adopt --service <id>\`, not
|
|
66
|
+
with this feature
|
|
67
|
+
- \`services[].operations\` — what each already exposes, so an operation you are
|
|
68
|
+
about to "add" that is already there becomes a MODIFIED requirement instead
|
|
69
|
+
- \`overlaps\` — active features already carrying a delta for these services.
|
|
70
|
+
\`loam dependencies --json\` (step 7) then says which must archive first
|
|
71
|
+
\`--op <operationId>\` seeds from an operation when you know the call but not who
|
|
72
|
+
owns it. A seed naming no \`services/<id>/\` is reported in \`unknown\` with the
|
|
73
|
+
closest real ids rather than refused — the feature may be introducing it, and a
|
|
74
|
+
typo looks identical until you read that list. \`scaffold\` is the literal step-3
|
|
75
|
+
command line the seeds imply, with \`--new-service\` where the service does not
|
|
76
|
+
exist yet.
|
|
77
|
+
3. Scaffold it: \`loam new $1 --title "$2"\`, adding \`--touches <id>\` for every service the
|
|
78
|
+
feature touches and \`--new-service <id>\` for every one it introduces. Every id goes
|
|
79
|
+
through the \`services/<id>/\` grammar, so a typo is refused (\`invalid-option\`)
|
|
80
|
+
rather than scaffolded; a \`--touches\` that matches nothing existing comes back as
|
|
81
|
+
a \`note\` with the close ids, not as a failure — read it, because a \`--touches\`
|
|
82
|
+
naming a service that does not exist is \`delta.service-unknown\` at validate time
|
|
83
|
+
and a phantom \`services/<typo>/\` directory if it ever archives.
|
|
84
|
+
4. Author what the templates left as TODO. This step is gated, not advisory:
|
|
85
|
+
\`loam archive\` refuses a scaffold nobody edited (\`scaffold.placeholder\`,
|
|
86
|
+
\`intent.empty\`), so the placeholder text cannot reach the living docs.
|
|
87
|
+
- \`intent.md\` — the problem in business terms, in prose; the scaffold's
|
|
88
|
+
comment-only Why/Scope count as unwritten
|
|
89
|
+
- \`delta.likec4\` — new elements and edges, each tagged \`#$1\`; every call edge carries
|
|
90
|
+
\`metadata { op '<operationId>' }\`; replace the scaffolded TODO description on each
|
|
91
|
+
new service. For a requirements-only feature DELETE this
|
|
92
|
+
file: an empty delta is legal, but a scaffold left half-filled is not.
|
|
93
|
+
Draw each edge with its relationship kind (\`-[calls]->\`, \`-[publishes]->\`,
|
|
94
|
+
\`-[delivers]->\`, …), and draw a direction only where the evidence shows
|
|
95
|
+
one: anything else is \`-[connects]->\`. A message runs producer
|
|
96
|
+
\`-[publishes]->\` topic and topic \`-[delivers]->\` consumer, never
|
|
97
|
+
producer \`->\` consumer. A producer outside the fleet is an \`#external\`
|
|
98
|
+
element whose edge carries \`metadata { publishes }\`. Declare every kind
|
|
99
|
+
you draw in the delta's own \`specification\`, and check that the living
|
|
100
|
+
map's declares it too. The archive copies the edge and never the
|
|
101
|
+
declaration, so a kind the map lacks refuses the archive (\`merge-failed\`)
|
|
102
|
+
even though validate and status call the feature ready.
|
|
103
|
+
\`loam instructions loam-drawing\` has the kinds and their styles
|
|
104
|
+
- \`specs/<svc>/spec.md\` — the example requirement ships INSIDE the template's
|
|
105
|
+
comment: copy it out, unindent, one behaviour per requirement, SHALL, at
|
|
106
|
+
least one Given/When/Then scenario; add \`Operations:\` once the operation exists
|
|
107
|
+
- \`specs/<svc>/arch.spec.md\` — the architectural obligations (outbox, retries,
|
|
108
|
+
idempotency, alerts), same grammar; a \`Covers:\` line per requirement naming the
|
|
109
|
+
tagged elements/edges it accounts for, or \`c4.uncovered\` says nothing does.
|
|
110
|
+
Write an edge by its endpoints' service names
|
|
111
|
+
(\`order-service -> payment-service\`), which resolve the same before and
|
|
112
|
+
after the archive
|
|
113
|
+
- write every document for a reviewer who has never seen the code.
|
|
114
|
+
\`intent.md\` gains a \`## How to read this feature\` section, a
|
|
115
|
+
business-requirement coverage table, and \`## Open questions\` as a table
|
|
116
|
+
(ID, question, blocks, owner, current default). Each spec delta opens
|
|
117
|
+
with a plain-language \`## Purpose\`. A long requirement body becomes a
|
|
118
|
+
one-line lead plus one bullet per SHALL sentence. Every abbreviation is
|
|
119
|
+
expanded on first use. "This delta" and "this feature" stay out of
|
|
120
|
+
requirement bodies and contract descriptions, because the archive copies
|
|
121
|
+
those into the living docs. A word the feature brings goes in
|
|
122
|
+
\`glossary/<term>.md\` and a decision in \`adrs/\`, both inside the feature,
|
|
123
|
+
and a cross-service flow in \`usecases/<name>.likec4\`, tagged with a
|
|
124
|
+
\`#cap-\` that resolves. \`loam instructions loam-authoring\`, "Writing
|
|
125
|
+
for a person", has the shapes
|
|
126
|
+
- \`specs/<svc>/openapi.yaml\` — define every operationId the edges reference.
|
|
127
|
+
A self-contained document holding ONLY the operations this feature adds,
|
|
128
|
+
changes or removes — never a copy of the living contract. An operation you
|
|
129
|
+
leave out stays exactly as the living contract has it, and a local \`$ref\`
|
|
130
|
+
(\`#/components/schemas/Order\`) resolves into the living document, so there
|
|
131
|
+
is nothing to restate. Every operation you quote costs a pin, and once a
|
|
132
|
+
parallel feature retires it — or moves it, and you quoted the old
|
|
133
|
+
address — a pinned quote is \`openapi.baseline-invalid\` and
|
|
134
|
+
\`openapi.op-revived\` both, an unpinned one \`openapi.op-revived\` alone
|
|
135
|
+
(\`asyncapi.slot-revived\` on the event axis) — archive refuses either.
|
|
136
|
+
Delete the quote; only a feature that MEANS to bring a retired operation
|
|
137
|
+
back keeps it, and archives past the finding with a human's \`--approve\`
|
|
138
|
+
- \`specs/<svc>/asyncapi.yaml\` — the event axis, only when the feature changes
|
|
139
|
+
what a service puts on or takes off the bus: an AsyncAPI 3.0 document
|
|
140
|
+
holding only the channel, operation and message slots you add, change or
|
|
141
|
+
remove (an edited slot is written out whole), new messages under
|
|
142
|
+
\`components.messages\`, and a \`Publishes:\`/\`Consumes:\` line on each
|
|
143
|
+
requirement that names them. \`loam new\` scaffolds none — an event
|
|
144
|
+
contract is genuinely optional
|
|
145
|
+
- for a service (or capability) this feature CREATES, the delta is the
|
|
146
|
+
living document's first draft, and \`loam archive\` carries only what you
|
|
147
|
+
mark as the document's own: the frontmatter \`owner\`, an H1 that neither
|
|
148
|
+
names $1 nor calls itself a delta (the scaffold's does both — retitle it),
|
|
149
|
+
and a \`## Purpose\` section — put the service's narrative there. Everything
|
|
150
|
+
else in the delta is read as being about the change and stays with it in
|
|
151
|
+
\`features/archive/\`, linked from the new document
|
|
152
|
+
- links: write each one so it resolves where you write it, relative to the
|
|
153
|
+
file. A link into this feature — from its deltas, or from any other
|
|
154
|
+
document whose links validate grades — is re-pointed by \`loam archive\`
|
|
155
|
+
to wherever the file ends up — a term in \`glossary/<term>.md\` at the living glossary,
|
|
156
|
+
anything else (an ADR in \`adrs/\` above all) inside
|
|
157
|
+
\`features/archive/\`, because a feature ADR is never copied into the living
|
|
158
|
+
tree. A decision meant to outlive this change belongs in
|
|
159
|
+
\`architecture/adrs/\` or the service's own \`adrs/\` instead. The same
|
|
160
|
+
holds inside this feature: its own documents (the intent, its ADRs) move
|
|
161
|
+
to \`features/archive/\` with it, and the archive re-expresses their links
|
|
162
|
+
for the move — never write them for the archived location yourself
|
|
163
|
+
4b. **Analyze before you pin.** Nothing grades this step, which is why it is here:
|
|
164
|
+
every check after it is a join between exact tokens, so two services that
|
|
165
|
+
agree on every operationId and disagree on what it means validate, archive
|
|
166
|
+
and ship green. Read the feature as its reviewer will, before rebase freezes it:
|
|
167
|
+
- \`loam show $1 --json\` — its \`review\` object joins the intent, the C4
|
|
168
|
+
objects, the API/event slices and the dependencies
|
|
169
|
+
- \`loam context <service> --feature $1 --json\` for every service it touches —
|
|
170
|
+
the living requirements verbatim, the edges one hop out, and this delta
|
|
171
|
+
- the \`neighbours\` step 2b's \`loam explore\` reported
|
|
172
|
+
Then write what the documents leave open under \`## Open questions\` in
|
|
173
|
+
\`intent.md\` (the scaffold already carries the heading), one table row per
|
|
174
|
+
question — ID, the question, what it blocks (the requirement id or edge it is
|
|
175
|
+
about), its owner, and the default that gets built if nobody answers:
|
|
176
|
+
- a SHALL two engineers could build two ways — an unstated unit, bound,
|
|
177
|
+
ordering, or an "eventually" with no window
|
|
178
|
+
- a value, limit or window two services state differently (a refund window,
|
|
179
|
+
a rounding rule, a retry budget), and which side refuses when they
|
|
180
|
+
disagree — a caller that accepts what its provider answers 4xx for is a
|
|
181
|
+
contradiction no check can see
|
|
182
|
+
- a \`Realizes:\` line whose requirement does not actually deliver the
|
|
183
|
+
capability promise it names, or a promise this feature changes that no
|
|
184
|
+
realizing requirement keeps
|
|
185
|
+
- per call edge in the delta: the timeout, the retry and what makes it safe
|
|
186
|
+
to repeat, what a partial failure leaves behind, and what compensates it —
|
|
187
|
+
an edge no requirement answers these for is a question, not a default
|
|
188
|
+
- each \`explore\` neighbour outside \`--touches\`: why it is untouched, or that
|
|
189
|
+
it is a candidate — adding one means a \`specs/<svc>/\` delta in this feature,
|
|
190
|
+
because that directory IS the feature's service list
|
|
191
|
+
Ask; do not answer for the author. The default column records what the
|
|
192
|
+
documents imply today, not what you would choose. A human answers by editing the file —
|
|
193
|
+
replacing a question with the decision, or with a change to the delta.
|
|
194
|
+
Nothing is graded: an empty section is legal, and so is an answered one.
|
|
195
|
+
5. **\`loam rebase $1\`** — the step between authoring and checking, and the one that
|
|
196
|
+
stops two features in flight from silently deleting each other's work. It pins
|
|
197
|
+
every MODIFIED/REMOVED requirement (\`Based-On:\`), and every operation and
|
|
198
|
+
asyncapi channel/operation/message slot the living contract already holds
|
|
199
|
+
(\`x-loam-based-on\`), to the living version you wrote against. What the
|
|
200
|
+
feature ADDS has no living version and takes no pin, so an add-only contract
|
|
201
|
+
delta needs no rebase. Any living operation or slot the delta spells is one
|
|
202
|
+
the merge upserts, so it needs its pin even when you changed one line of it.
|
|
203
|
+
Without the pins, \`delta.baseline-missing\` / \`openapi.baseline-missing\` /
|
|
204
|
+
\`asyncapi.baseline-missing\` GATE
|
|
205
|
+
the archive: before they did, the second feature to archive reverted the
|
|
206
|
+
first — with \`+0 ~1 -0\`, exit 0, and nobody told. Rebase clears them; a
|
|
207
|
+
human's \`--approve\` is the only other way past.
|
|
208
|
+
Restamping is not resolving: if rebase reports a requirement as MOVED, re-read
|
|
209
|
+
the living text and fold in what you still mean BEFORE you ship.
|
|
210
|
+
6. \`loam validate --feature $1 --json\`. Do not stop while \`valid\` is false.
|
|
211
|
+
7. \`loam dependencies $1 --json\` before anyone starts building: it says which
|
|
212
|
+
features in flight have to archive first (\`order\`) and which collisions no
|
|
213
|
+
ordering fixes (\`conflicts\`, \`cycles\`). Every conflict it names is one \`loam rebase\`
|
|
214
|
+
cannot fix for you — two intentions have to be merged by people.
|
|
215
|
+
|
|
216
|
+
The operation's three spellings — the edge's \`op\`, the requirement's \`Operations:\`
|
|
217
|
+
line, and the OpenAPI \`operationId\` — must match exactly.
|
|
218
|
+
`,
|
|
219
|
+
};
|
|
220
|
+
//# sourceMappingURL=feature.js.map
|