@ybotok/loam 0.1.0-beta.2 → 0.2.0-alpha.1
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 +2570 -61
- package/COMPARISON.md +80 -63
- package/CONTRIBUTING.md +84 -0
- package/MIGRATING-from-OpenSpec.md +213 -54
- package/QUICKSTART.md +125 -0
- package/README.md +450 -150
- package/ROADMAP.md +494 -0
- package/SCHEMA.md +2362 -245
- package/SECURITY.md +21 -3
- package/WORKFLOW.md +701 -0
- package/dist/cli.js +113 -19
- package/dist/cli.js.map +1 -1
- package/dist/commands/adopt/adopt.js +209 -0
- package/dist/commands/adopt/adopt.js.map +1 -0
- package/dist/commands/adopt/render.js +268 -0
- package/dist/commands/adopt/render.js.map +1 -0
- package/dist/commands/archive/archive.js +77 -0
- package/dist/commands/archive/archive.js.map +1 -0
- package/dist/commands/archive/plan/contracts/asyncapi.js +178 -0
- package/dist/commands/archive/plan/contracts/asyncapi.js.map +1 -0
- package/dist/commands/archive/plan/contracts/openapi.js +159 -0
- package/dist/commands/archive/plan/contracts/openapi.js.map +1 -0
- package/dist/commands/archive/plan/gate.js +317 -0
- package/dist/commands/archive/plan/gate.js.map +1 -0
- package/dist/commands/archive/plan/landscape.js +161 -0
- package/dist/commands/archive/plan/landscape.js.map +1 -0
- package/dist/commands/archive/plan/refusal.js +111 -0
- package/dist/commands/archive/plan/refusal.js.map +1 -0
- package/dist/commands/archive/plan/specs.js +237 -0
- package/dist/commands/archive/plan/specs.js.map +1 -0
- package/dist/commands/archive/plan/state.js +27 -0
- package/dist/commands/archive/plan/state.js.map +1 -0
- package/dist/commands/archive/run.js +251 -0
- package/dist/commands/archive/run.js.map +1 -0
- package/dist/commands/context/context.js +99 -0
- package/dist/commands/context/context.js.map +1 -0
- package/dist/commands/context/print.js +283 -0
- package/dist/commands/context/print.js.map +1 -0
- package/dist/commands/delta/delta.js +279 -0
- package/dist/commands/delta/delta.js.map +1 -0
- package/dist/commands/delta/print.js +205 -0
- package/dist/commands/delta/print.js.map +1 -0
- package/dist/commands/dependencies.js +9 -7
- package/dist/commands/dependencies.js.map +1 -1
- package/dist/commands/diff/diff.js +93 -0
- package/dist/commands/diff/diff.js.map +1 -0
- package/dist/commands/diff/print.js +38 -0
- package/dist/commands/diff/print.js.map +1 -0
- package/dist/commands/doctor.js +5 -4
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/explain/explain.js +151 -0
- package/dist/commands/explain/explain.js.map +1 -0
- package/dist/commands/explore.js +29 -24
- package/dist/commands/explore.js.map +1 -1
- package/dist/commands/gate/gate.js +115 -0
- package/dist/commands/gate/gate.js.map +1 -0
- package/dist/commands/gate/print.js +54 -0
- package/dist/commands/gate/print.js.map +1 -0
- package/dist/commands/gherkin/commit.js +146 -0
- package/dist/commands/gherkin/commit.js.map +1 -0
- package/dist/commands/gherkin/gherkin.js +246 -0
- package/dist/commands/gherkin/gherkin.js.map +1 -0
- package/dist/commands/gherkin/reconcile.js +149 -0
- package/dist/commands/gherkin/reconcile.js.map +1 -0
- package/dist/commands/gherkin/render.js +77 -0
- package/dist/commands/gherkin/render.js.map +1 -0
- package/dist/commands/init/example.js +204 -0
- package/dist/commands/init/example.js.map +1 -0
- package/dist/commands/init/first-hour.js +28 -0
- package/dist/commands/init/first-hour.js.map +1 -0
- package/dist/commands/{init.js → init/init.js} +146 -71
- package/dist/commands/init/init.js.map +1 -0
- package/dist/commands/init/mcp.js +131 -0
- package/dist/commands/init/mcp.js.map +1 -0
- package/dist/commands/init/options.js +78 -0
- package/dist/commands/init/options.js.map +1 -0
- package/dist/commands/instructions.js +82 -14
- package/dist/commands/instructions.js.map +1 -1
- package/dist/commands/list/campaign/campaign.js +65 -0
- package/dist/commands/list/campaign/campaign.js.map +1 -0
- package/dist/commands/list/campaign/owners.js +65 -0
- package/dist/commands/list/campaign/owners.js.map +1 -0
- package/dist/commands/list/json.js +157 -0
- package/dist/commands/list/json.js.map +1 -0
- package/dist/commands/list/list.js +343 -0
- package/dist/commands/list/list.js.map +1 -0
- package/dist/commands/list/print.js +301 -0
- package/dist/commands/list/print.js.map +1 -0
- package/dist/commands/list/review.js +120 -0
- package/dist/commands/list/review.js.map +1 -0
- package/dist/commands/list/views.js +105 -0
- package/dist/commands/list/views.js.map +1 -0
- package/dist/commands/mcp/dispatch.js +183 -0
- package/dist/commands/mcp/dispatch.js.map +1 -0
- package/dist/commands/mcp/mcp.js +34 -0
- package/dist/commands/mcp/mcp.js.map +1 -0
- package/dist/commands/mcp/serve.js +55 -0
- package/dist/commands/mcp/serve.js.map +1 -0
- package/dist/commands/migrate-openspec/materialize/active.js +170 -0
- package/dist/commands/migrate-openspec/materialize/active.js.map +1 -0
- package/dist/commands/migrate-openspec/materialize/feature.js +41 -0
- package/dist/commands/migrate-openspec/materialize/feature.js.map +1 -0
- package/dist/commands/migrate-openspec/materialize/living.js +62 -0
- package/dist/commands/migrate-openspec/materialize/living.js.map +1 -0
- package/dist/commands/migrate-openspec/materialize/stage.js +142 -0
- package/dist/commands/migrate-openspec/materialize/stage.js.map +1 -0
- package/dist/commands/migrate-openspec/materialize/target.js +219 -0
- package/dist/commands/migrate-openspec/materialize/target.js.map +1 -0
- package/dist/commands/migrate-openspec/migrate-openspec.js +142 -0
- package/dist/commands/migrate-openspec/migrate-openspec.js.map +1 -0
- package/dist/commands/migrate-openspec/openspec/decisions.js +91 -0
- package/dist/commands/migrate-openspec/openspec/decisions.js.map +1 -0
- package/dist/commands/migrate-openspec/openspec/error.js +19 -0
- package/dist/commands/migrate-openspec/openspec/error.js.map +1 -0
- package/dist/commands/migrate-openspec/openspec/mapping.js +170 -0
- package/dist/commands/migrate-openspec/openspec/mapping.js.map +1 -0
- package/dist/commands/migrate-openspec/openspec/paths.js +43 -0
- package/dist/commands/migrate-openspec/openspec/paths.js.map +1 -0
- package/dist/commands/migrate-openspec/openspec/read.js +49 -0
- package/dist/commands/migrate-openspec/openspec/read.js.map +1 -0
- package/dist/commands/migrate-openspec/print.js +89 -0
- package/dist/commands/migrate-openspec/print.js.map +1 -0
- package/dist/commands/new/commit.js +76 -0
- package/dist/commands/new/commit.js.map +1 -0
- package/dist/commands/new/new.js +283 -0
- package/dist/commands/new/new.js.map +1 -0
- package/dist/commands/new/templates.js +355 -0
- package/dist/commands/new/templates.js.map +1 -0
- package/dist/commands/open.js +203 -0
- package/dist/commands/open.js.map +1 -0
- package/dist/commands/policy/format.js +152 -0
- package/dist/commands/policy/format.js.map +1 -0
- package/dist/commands/{docs-repo-gate.js → policy/gate.js} +11 -11
- package/dist/commands/policy/gate.js.map +1 -0
- package/dist/commands/rebase/edit.js +106 -0
- package/dist/commands/rebase/edit.js.map +1 -0
- package/dist/commands/rebase/living.js +185 -0
- package/dist/commands/rebase/living.js.map +1 -0
- package/dist/commands/rebase/plan.js +245 -0
- package/dist/commands/rebase/plan.js.map +1 -0
- package/dist/commands/rebase/rebase.js +275 -0
- package/dist/commands/rebase/rebase.js.map +1 -0
- package/dist/commands/seed/commit.js +192 -0
- package/dist/commands/seed/commit.js.map +1 -0
- package/dist/commands/seed/plan.js +133 -0
- package/dist/commands/seed/plan.js.map +1 -0
- package/dist/commands/seed/seed.js +172 -0
- package/dist/commands/seed/seed.js.map +1 -0
- package/dist/commands/show/feature.js +178 -0
- package/dist/commands/show/feature.js.map +1 -0
- package/dist/commands/show/marks.js +24 -0
- package/dist/commands/show/marks.js.map +1 -0
- package/dist/commands/{show.js → show/service.js} +63 -152
- package/dist/commands/show/service.js.map +1 -0
- package/dist/commands/show/show.js +77 -0
- package/dist/commands/show/show.js.map +1 -0
- package/dist/commands/status/json.js +45 -0
- package/dist/commands/status/json.js.map +1 -0
- package/dist/commands/status/print.js +157 -0
- package/dist/commands/status/print.js.map +1 -0
- package/dist/commands/status/status.js +119 -0
- package/dist/commands/status/status.js.map +1 -0
- package/dist/commands/steps/steps.js +189 -0
- package/dist/commands/steps/steps.js.map +1 -0
- package/dist/commands/subsystem/edit.js +192 -0
- package/dist/commands/subsystem/edit.js.map +1 -0
- package/dist/commands/subsystem/move.js +265 -0
- package/dist/commands/subsystem/move.js.map +1 -0
- package/dist/commands/subsystem/query.js +115 -0
- package/dist/commands/subsystem/query.js.map +1 -0
- package/dist/commands/subsystem/subsystem.js +101 -0
- package/dist/commands/subsystem/subsystem.js.map +1 -0
- package/dist/commands/subsystem/sync.js +103 -0
- package/dist/commands/subsystem/sync.js.map +1 -0
- package/dist/commands/subsystem/txn/txn.js +94 -0
- package/dist/commands/subsystem/txn/txn.js.map +1 -0
- package/dist/commands/subsystem/txn/views.js +70 -0
- package/dist/commands/subsystem/txn/views.js.map +1 -0
- package/dist/commands/unarchive/manifest.js +160 -0
- package/dist/commands/unarchive/manifest.js.map +1 -0
- package/dist/commands/{unarchive.js → unarchive/restore.js} +47 -160
- package/dist/commands/unarchive/restore.js.map +1 -0
- package/dist/commands/unarchive/unarchive.js +67 -0
- package/dist/commands/unarchive/unarchive.js.map +1 -0
- package/dist/commands/validate/arch-coverage.js +194 -0
- package/dist/commands/validate/arch-coverage.js.map +1 -0
- package/dist/commands/validate/checks/fleet-shape.js +296 -0
- package/dist/commands/validate/checks/fleet-shape.js.map +1 -0
- package/dist/commands/validate/checks/health-deps.js +55 -0
- package/dist/commands/validate/checks/health-deps.js.map +1 -0
- package/dist/commands/validate/checks/requirements.js +254 -0
- package/dist/commands/validate/checks/requirements.js.map +1 -0
- package/dist/commands/validate/checks/sources.js +76 -0
- package/dist/commands/validate/checks/sources.js.map +1 -0
- package/dist/commands/validate/checks/vocabulary.js +31 -0
- package/dist/commands/validate/checks/vocabulary.js.map +1 -0
- package/dist/commands/validate/feature.js +216 -0
- package/dist/commands/validate/feature.js.map +1 -0
- package/dist/commands/validate/fleet/census.js +69 -0
- package/dist/commands/validate/fleet/census.js.map +1 -0
- package/dist/commands/validate/fleet/kind-tags.js +39 -0
- package/dist/commands/validate/fleet/kind-tags.js.map +1 -0
- package/dist/commands/validate/fleet/landscape.js +353 -0
- package/dist/commands/validate/fleet/landscape.js.map +1 -0
- package/dist/commands/validate/fleet/load.js +52 -0
- package/dist/commands/validate/fleet/load.js.map +1 -0
- package/dist/commands/validate/fleet/obligations.js +236 -0
- package/dist/commands/validate/fleet/obligations.js.map +1 -0
- package/dist/commands/validate/fleet/scorecard/adoption.js +102 -0
- package/dist/commands/validate/fleet/scorecard/adoption.js.map +1 -0
- package/dist/commands/validate/fleet/scorecard/contracts.js +98 -0
- package/dist/commands/validate/fleet/scorecard/contracts.js.map +1 -0
- package/dist/commands/validate/fleet/scorecard/print.js +63 -0
- package/dist/commands/validate/fleet/scorecard/print.js.map +1 -0
- package/dist/commands/validate/fleet/scorecard/scorecard.js +156 -0
- package/dist/commands/validate/fleet/scorecard/scorecard.js.map +1 -0
- package/dist/commands/validate/fleet/usecases/capability-tag.js +94 -0
- package/dist/commands/validate/fleet/usecases/capability-tag.js.map +1 -0
- package/dist/commands/validate/fleet/usecases/place.js +13 -0
- package/dist/commands/validate/fleet/usecases/place.js.map +1 -0
- package/dist/commands/validate/fleet/usecases/requirement-tag.js +95 -0
- package/dist/commands/validate/fleet/usecases/requirement-tag.js.map +1 -0
- package/dist/commands/validate/fleet/usecases/steps.js +197 -0
- package/dist/commands/validate/fleet/usecases/steps.js.map +1 -0
- package/dist/commands/validate/fleet/usecases/usecases.js +99 -0
- package/dist/commands/validate/fleet/usecases/usecases.js.map +1 -0
- package/dist/commands/validate/fleet/views/ids.js +40 -0
- package/dist/commands/validate/fleet/views/ids.js.map +1 -0
- package/dist/commands/validate/fleet/views/stale.js +59 -0
- package/dist/commands/validate/fleet/views/stale.js.map +1 -0
- package/dist/commands/validate/links/corpus.js +92 -0
- package/dist/commands/validate/links/corpus.js.map +1 -0
- package/dist/commands/validate/links/glossary.js +75 -0
- package/dist/commands/validate/links/glossary.js.map +1 -0
- package/dist/commands/validate/report.js +269 -0
- package/dist/commands/validate/report.js.map +1 -0
- package/dist/commands/validate/service/api.js +338 -0
- package/dist/commands/validate/service/api.js.map +1 -0
- package/dist/commands/validate/service/events/events.js +219 -0
- package/dist/commands/validate/service/events/events.js.map +1 -0
- package/dist/commands/validate/service/events/message-producers.js +77 -0
- package/dist/commands/validate/service/events/message-producers.js.map +1 -0
- package/dist/commands/validate/service/evidence-pins.js +131 -0
- package/dist/commands/validate/service/evidence-pins.js.map +1 -0
- package/dist/commands/validate/service/service.js +250 -0
- package/dist/commands/validate/service/service.js.map +1 -0
- package/dist/commands/validate/service/specs.js +219 -0
- package/dist/commands/validate/service/specs.js.map +1 -0
- package/dist/commands/validate/service/spine.js +113 -0
- package/dist/commands/validate/service/spine.js.map +1 -0
- package/dist/commands/validate/validate.js +338 -0
- package/dist/commands/validate/validate.js.map +1 -0
- package/dist/commands/verify/cross/diff.js +182 -0
- package/dist/commands/verify/cross/diff.js.map +1 -0
- package/dist/commands/verify/evidence/contract.js +32 -0
- package/dist/commands/verify/evidence/contract.js.map +1 -0
- package/dist/commands/verify/evidence/pins.js +52 -0
- package/dist/commands/verify/evidence/pins.js.map +1 -0
- package/dist/commands/verify/evidence/read.js +72 -0
- package/dist/commands/verify/evidence/read.js.map +1 -0
- package/dist/commands/verify/frozen.js +241 -0
- package/dist/commands/verify/frozen.js.map +1 -0
- package/dist/commands/verify/record.js +226 -0
- package/dist/commands/verify/record.js.map +1 -0
- package/dist/commands/verify/report.js +223 -0
- package/dist/commands/verify/report.js.map +1 -0
- package/dist/commands/verify/results.js +246 -0
- package/dist/commands/verify/results.js.map +1 -0
- package/dist/commands/verify/verify.js +217 -0
- package/dist/commands/verify/verify.js.map +1 -0
- package/dist/commands/vouch/contract.js +11 -0
- package/dist/commands/vouch/contract.js.map +1 -0
- package/dist/commands/vouch/pack/contract.js +2 -0
- package/dist/commands/vouch/pack/contract.js.map +1 -0
- package/dist/commands/vouch/pack/pack.js +266 -0
- package/dist/commands/vouch/pack/pack.js.map +1 -0
- package/dist/commands/vouch/pack/print.js +271 -0
- package/dist/commands/vouch/pack/print.js.map +1 -0
- package/dist/commands/vouch/pack/sections.js +142 -0
- package/dist/commands/vouch/pack/sections.js.map +1 -0
- package/dist/commands/vouch/prompt/confirm.js +46 -0
- package/dist/commands/vouch/prompt/confirm.js.map +1 -0
- package/dist/commands/vouch/report.js +101 -0
- package/dist/commands/vouch/report.js.map +1 -0
- package/dist/commands/vouch/run.js +285 -0
- package/dist/commands/vouch/run.js.map +1 -0
- package/dist/commands/vouch/sample/plan.js +125 -0
- package/dist/commands/vouch/sample/plan.js.map +1 -0
- package/dist/commands/vouch/sample/print.js +109 -0
- package/dist/commands/vouch/sample/print.js.map +1 -0
- package/dist/commands/vouch/vet/verify.js +123 -0
- package/dist/commands/vouch/vet/verify.js.map +1 -0
- package/dist/commands/vouch/vouch.js +176 -0
- package/dist/commands/vouch/vouch.js.map +1 -0
- package/dist/core/agent/agents-md/artifacts.js +220 -0
- package/dist/core/agent/agents-md/artifacts.js.map +1 -0
- package/dist/core/agent/agents-md/command-map.js +324 -0
- package/dist/core/agent/agents-md/command-map.js.map +1 -0
- package/dist/core/agent/agents-md/cycle.js +165 -0
- package/dist/core/agent/agents-md/cycle.js.map +1 -0
- package/dist/core/agent/agents-md/map/explain.js +34 -0
- package/dist/core/agent/agents-md/map/explain.js.map +1 -0
- package/dist/core/agent/agents-md/map/lenses/context.js +41 -0
- package/dist/core/agent/agents-md/map/lenses/context.js.map +1 -0
- package/dist/core/agent/agents-md/map/lenses/diff.js +46 -0
- package/dist/core/agent/agents-md/map/lenses/diff.js.map +1 -0
- package/dist/core/agent/agents-md/map/lenses/gate.js +57 -0
- package/dist/core/agent/agents-md/map/lenses/gate.js.map +1 -0
- package/dist/core/agent/agents-md/map/mcp.js +41 -0
- package/dist/core/agent/agents-md/map/mcp.js.map +1 -0
- package/dist/core/agent/agents-md/map/status.js +62 -0
- package/dist/core/agent/agents-md/map/status.js.map +1 -0
- package/dist/core/agent/agents-md/map/subsystem.js +32 -0
- package/dist/core/agent/agents-md/map/subsystem.js.map +1 -0
- package/dist/core/agent/agents-md/map/usecases.js +60 -0
- package/dist/core/agent/agents-md/map/usecases.js.map +1 -0
- package/dist/core/agent/agents-md/refusals.js +246 -0
- package/dist/core/agent/agents-md/refusals.js.map +1 -0
- package/dist/core/agent/agents-md/shipped/archive-gate.js +98 -0
- package/dist/core/agent/agents-md/shipped/archive-gate.js.map +1 -0
- package/dist/core/agent/agents-md/spine.js +40 -0
- package/dist/core/agent/agents-md/spine.js.map +1 -0
- package/dist/core/agent/agents-md.js +170 -0
- package/dist/core/agent/agents-md.js.map +1 -0
- package/dist/core/agent/agents-stamp.js +155 -0
- package/dist/core/agent/agents-stamp.js.map +1 -0
- package/dist/core/agent/contract.js +2 -0
- package/dist/core/agent/contract.js.map +1 -0
- package/dist/core/agent/protocol.js +193 -0
- package/dist/core/agent/protocol.js.map +1 -0
- package/dist/core/agent/scaffold.js +259 -0
- package/dist/core/agent/scaffold.js.map +1 -0
- package/dist/core/agent/support/report.js +103 -0
- package/dist/core/agent/support/report.js.map +1 -0
- package/dist/core/agent/tools/dialects.js +150 -0
- package/dist/core/agent/tools/dialects.js.map +1 -0
- package/dist/core/agent/tools/registry.js +228 -0
- package/dist/core/agent/tools/registry.js.map +1 -0
- package/dist/core/agent/workflows/adopt.js +133 -0
- package/dist/core/agent/workflows/adopt.js.map +1 -0
- package/dist/core/agent/workflows/check.js +334 -0
- package/dist/core/agent/workflows/check.js.map +1 -0
- package/dist/core/agent/workflows/closing.js +262 -0
- package/dist/core/agent/workflows/closing.js.map +1 -0
- package/dist/core/agent/workflows/feature.js +105 -0
- package/dist/core/agent/workflows/feature.js.map +1 -0
- package/dist/core/agent/workflows/implement.js +105 -0
- package/dist/core/agent/workflows/implement.js.map +1 -0
- package/dist/core/agent/workflows/reference/authoring.js +209 -0
- package/dist/core/agent/workflows/reference/authoring.js.map +1 -0
- package/dist/core/agent/workflows/reference/codes.js +65 -0
- package/dist/core/agent/workflows/reference/codes.js.map +1 -0
- package/dist/core/agent/workflows/reference/done-check.js +188 -0
- package/dist/core/agent/workflows/reference/done-check.js.map +1 -0
- package/dist/core/agent/workflows/reference/reference.js +16 -0
- package/dist/core/agent/workflows/reference/reference.js.map +1 -0
- package/dist/core/agent/workflows/reference/spine.js +297 -0
- package/dist/core/agent/workflows/reference/spine.js.map +1 -0
- package/dist/core/asyncapi/baseline/plan.js +110 -0
- package/dist/core/asyncapi/baseline/plan.js.map +1 -0
- package/dist/core/asyncapi/baseline/surfaces.js +54 -0
- package/dist/core/asyncapi/baseline/surfaces.js.map +1 -0
- package/dist/core/asyncapi/depth.js +164 -0
- package/dist/core/asyncapi/depth.js.map +1 -0
- package/dist/core/asyncapi/digest.js +141 -0
- package/dist/core/asyncapi/digest.js.map +1 -0
- package/dist/core/asyncapi/merge/components.js +91 -0
- package/dist/core/asyncapi/merge/components.js.map +1 -0
- package/dist/core/asyncapi/merge/error.js +33 -0
- package/dist/core/asyncapi/merge/error.js.map +1 -0
- package/dist/core/asyncapi/merge/markers.js +308 -0
- package/dist/core/asyncapi/merge/markers.js.map +1 -0
- package/dist/core/asyncapi/merge/merge.js +215 -0
- package/dist/core/asyncapi/merge/merge.js.map +1 -0
- package/dist/core/asyncapi/merge/pin.js +107 -0
- package/dist/core/asyncapi/merge/pin.js.map +1 -0
- package/dist/core/asyncapi/model.js +11 -0
- package/dist/core/asyncapi/model.js.map +1 -0
- package/dist/core/asyncapi/producers.js +50 -0
- package/dist/core/asyncapi/producers.js.map +1 -0
- package/dist/core/asyncapi/read.js +239 -0
- package/dist/core/asyncapi/read.js.map +1 -0
- package/dist/core/brief/brief.js +225 -0
- package/dist/core/brief/brief.js.map +1 -0
- package/dist/core/brief/checks.js +250 -0
- package/dist/core/brief/checks.js.map +1 -0
- package/dist/core/brief/landscape.js +194 -0
- package/dist/core/brief/landscape.js.map +1 -0
- package/dist/core/brief/targets.js +226 -0
- package/dist/core/brief/targets.js.map +1 -0
- package/dist/core/brief/unchecked.js +47 -0
- package/dist/core/brief/unchecked.js.map +1 -0
- package/dist/core/c4/arch.js +282 -0
- package/dist/core/c4/arch.js.map +1 -0
- package/dist/core/c4/likec4.js +88 -0
- package/dist/core/c4/likec4.js.map +1 -0
- package/dist/core/c4/parsed/dynamic-views.js +132 -0
- package/dist/core/c4/parsed/dynamic-views.js.map +1 -0
- package/dist/core/c4/parsed/specification.js +78 -0
- package/dist/core/c4/parsed/specification.js.map +1 -0
- package/dist/core/c4/parsed/values.js +57 -0
- package/dist/core/c4/parsed/values.js.map +1 -0
- package/dist/core/c4/parsed/view-ids.js +75 -0
- package/dist/core/c4/parsed/view-ids.js.map +1 -0
- package/dist/core/c4/project/architecture.js +45 -0
- package/dist/core/c4/project/architecture.js.map +1 -0
- package/dist/core/c4/project/documents.js +58 -0
- package/dist/core/c4/project/documents.js.map +1 -0
- package/dist/core/c4/project/load.js +183 -0
- package/dist/core/c4/project/load.js.map +1 -0
- package/dist/core/c4/resolve/service.js +113 -0
- package/dist/core/c4/resolve/service.js.map +1 -0
- package/dist/core/c4/seed/fleet-file.js +201 -0
- package/dist/core/c4/seed/fleet-file.js.map +1 -0
- package/dist/core/c4/seed/items.js +91 -0
- package/dist/core/c4/seed/items.js.map +1 -0
- package/dist/core/c4/seed/stamp.js +48 -0
- package/dist/core/c4/seed/stamp.js.map +1 -0
- package/dist/core/c4/seed/template.js +109 -0
- package/dist/core/c4/seed/template.js.map +1 -0
- package/dist/core/c4/source-mask.js +82 -0
- package/dist/core/c4/source-mask.js.map +1 -0
- package/dist/core/c4/source-scan.js +227 -0
- package/dist/core/c4/source-scan.js.map +1 -0
- package/dist/core/c4/splice/authored-source.js +101 -0
- package/dist/core/c4/splice/authored-source.js.map +1 -0
- package/dist/core/c4/splice/contract.js +10 -0
- package/dist/core/c4/splice/contract.js.map +1 -0
- package/dist/core/c4/splice/delta-blocks.js +126 -0
- package/dist/core/c4/splice/delta-blocks.js.map +1 -0
- package/dist/core/c4/splice/identity/edges.js +36 -0
- package/dist/core/c4/splice/identity/edges.js.map +1 -0
- package/dist/core/c4/splice/landscape-merge.js +269 -0
- package/dist/core/c4/splice/landscape-merge.js.map +1 -0
- package/dist/core/c4/splice/placement.js +194 -0
- package/dist/core/c4/splice/placement.js.map +1 -0
- package/dist/core/c4/workspace.js +172 -0
- package/dist/core/c4/workspace.js.map +1 -0
- package/dist/core/capabilities/authoring/notes.js +141 -0
- package/dist/core/capabilities/authoring/notes.js.map +1 -0
- package/dist/core/capabilities/capabilities.js +124 -0
- package/dist/core/capabilities/capabilities.js.map +1 -0
- package/dist/core/capabilities/delta/doc.js +50 -0
- package/dist/core/capabilities/delta/doc.js.map +1 -0
- package/dist/core/capabilities/delta/overlay.js +129 -0
- package/dist/core/capabilities/delta/overlay.js.map +1 -0
- package/dist/core/capabilities/delta/summary.js +57 -0
- package/dist/core/capabilities/delta/summary.js.map +1 -0
- package/dist/core/capabilities/delta/tree.js +43 -0
- package/dist/core/capabilities/delta/tree.js.map +1 -0
- package/dist/core/capabilities/delta/uncovered.js +222 -0
- package/dist/core/capabilities/delta/uncovered.js.map +1 -0
- package/dist/core/capabilities/findings.js +342 -0
- package/dist/core/capabilities/findings.js.map +1 -0
- package/dist/core/capabilities/realizes/findings.js +181 -0
- package/dist/core/capabilities/realizes/findings.js.map +1 -0
- package/dist/core/capabilities/realizes/join.js +143 -0
- package/dist/core/capabilities/realizes/join.js.map +1 -0
- package/dist/core/capabilities/rollup.js +199 -0
- package/dist/core/capabilities/rollup.js.map +1 -0
- package/dist/core/capabilities/tree.js +126 -0
- package/dist/core/capabilities/tree.js.map +1 -0
- package/dist/core/capabilities/usecase-join.js +277 -0
- package/dist/core/capabilities/usecase-join.js.map +1 -0
- package/dist/core/coherence/authoring/scaffold.js +177 -0
- package/dist/core/coherence/authoring/scaffold.js.map +1 -0
- package/dist/core/coherence/authoring/sentinels.js +74 -0
- package/dist/core/coherence/authoring/sentinels.js.map +1 -0
- package/dist/core/coherence/coherence.js +251 -0
- package/dist/core/coherence/coherence.js.map +1 -0
- package/dist/core/coherence/declared.js +269 -0
- package/dist/core/coherence/declared.js.map +1 -0
- package/dist/core/coherence/events/declared.js +206 -0
- package/dist/core/coherence/events/declared.js.map +1 -0
- package/dist/core/coherence/events/events.js +204 -0
- package/dist/core/coherence/events/events.js.map +1 -0
- package/dist/core/coherence/events/grades.js +166 -0
- package/dist/core/coherence/events/grades.js.map +1 -0
- package/dist/core/coherence/events/lookups.js +122 -0
- package/dist/core/coherence/events/lookups.js.map +1 -0
- package/dist/core/coherence/events/merged.js +40 -0
- package/dist/core/coherence/events/merged.js.map +1 -0
- package/dist/core/coherence/living.js +198 -0
- package/dist/core/coherence/living.js.map +1 -0
- package/dist/core/coherence/lookups.js +155 -0
- package/dist/core/coherence/lookups.js.map +1 -0
- package/dist/core/coherence/pending.js +39 -0
- package/dist/core/coherence/pending.js.map +1 -0
- package/dist/core/conflict-markers.js +60 -0
- package/dist/core/conflict-markers.js.map +1 -0
- package/dist/core/delta/claims.js +73 -0
- package/dist/core/delta/claims.js.map +1 -0
- package/dist/core/delta/delta.js +296 -0
- package/dist/core/delta/delta.js.map +1 -0
- package/dist/core/delta/document.js +177 -0
- package/dist/core/delta/document.js.map +1 -0
- package/dist/core/delta/scope.js +48 -0
- package/dist/core/delta/scope.js.map +1 -0
- package/dist/core/delta/select.js +237 -0
- package/dist/core/delta/select.js.map +1 -0
- package/dist/core/dependencies/dependencies.js +141 -0
- package/dist/core/dependencies/dependencies.js.map +1 -0
- package/dist/core/dependencies/facts.js +165 -0
- package/dist/core/dependencies/facts.js.map +1 -0
- package/dist/core/dependencies/fanin.js +88 -0
- package/dist/core/dependencies/fanin.js.map +1 -0
- package/dist/core/dependencies/graph.js +106 -0
- package/dist/core/dependencies/graph.js.map +1 -0
- package/dist/core/diff/base-git.js +148 -0
- package/dist/core/diff/base-git.js.map +1 -0
- package/dist/core/diff/base-state.js +209 -0
- package/dist/core/diff/base-state.js.map +1 -0
- package/dist/core/diff/current-state.js +96 -0
- package/dist/core/diff/current-state.js.map +1 -0
- package/dist/core/diff/scope/changed-paths.js +188 -0
- package/dist/core/diff/scope/changed-paths.js.map +1 -0
- package/dist/core/diff/semantic.js +243 -0
- package/dist/core/diff/semantic.js.map +1 -0
- package/dist/core/diff/victims.js +247 -0
- package/dist/core/diff/victims.js.map +1 -0
- package/dist/core/docs.js +59 -55
- package/dist/core/docs.js.map +1 -1
- package/dist/core/doctor/agents.js +222 -0
- package/dist/core/doctor/agents.js.map +1 -0
- package/dist/core/doctor/config.js +135 -0
- package/dist/core/doctor/config.js.map +1 -0
- package/dist/core/doctor/doctor.js +275 -0
- package/dist/core/doctor/doctor.js.map +1 -0
- package/dist/core/doctor/report.js +13 -0
- package/dist/core/doctor/report.js.map +1 -0
- package/dist/core/doctor/residue.js +110 -0
- package/dist/core/doctor/residue.js.map +1 -0
- package/dist/core/document/apply.js +77 -0
- package/dist/core/document/apply.js.map +1 -0
- package/dist/core/{frontmatter.js → document/frontmatter.js} +48 -2
- package/dist/core/document/frontmatter.js.map +1 -0
- package/dist/core/document/grammar/directives.js +143 -0
- package/dist/core/document/grammar/directives.js.map +1 -0
- package/dist/core/document/parse.js +263 -0
- package/dist/core/document/parse.js.map +1 -0
- package/dist/core/document/scenarios.js +221 -0
- package/dist/core/document/scenarios.js.map +1 -0
- package/dist/core/document/spec.js +241 -0
- package/dist/core/document/spec.js.map +1 -0
- package/dist/core/{config.js → envelope/config.js} +79 -18
- package/dist/core/envelope/config.js.map +1 -0
- package/dist/core/envelope/json.js +175 -0
- package/dist/core/envelope/json.js.map +1 -0
- package/dist/core/{version.js → envelope/version.js} +3 -3
- package/dist/core/envelope/version.js.map +1 -0
- package/dist/core/explain/families.js +175 -0
- package/dist/core/explain/families.js.map +1 -0
- package/dist/core/explain/fix-tables.js +178 -0
- package/dist/core/explain/fix-tables.js.map +1 -0
- package/dist/core/explain/lookup.js +181 -0
- package/dist/core/explain/lookup.js.map +1 -0
- package/dist/core/explain/refusals.js +49 -0
- package/dist/core/explain/refusals.js.map +1 -0
- package/dist/core/explain/terms.js +144 -0
- package/dist/core/explain/terms.js.map +1 -0
- package/dist/core/explore/describe.js +105 -0
- package/dist/core/explore/describe.js.map +1 -0
- package/dist/core/{explore.js → explore/explore.js} +50 -101
- package/dist/core/explore/explore.js.map +1 -0
- package/dist/core/fleet-context.js +132 -77
- package/dist/core/fleet-context.js.map +1 -1
- package/dist/core/gate/checks.js +201 -0
- package/dist/core/gate/checks.js.map +1 -0
- package/dist/core/gate/partners.js +205 -0
- package/dist/core/gate/partners.js.map +1 -0
- package/dist/core/gate/report.js +47 -0
- package/dist/core/gate/report.js.map +1 -0
- package/dist/core/gate/verification.js +113 -0
- package/dist/core/gate/verification.js.map +1 -0
- package/dist/core/gherkin/digest.js +60 -0
- package/dist/core/gherkin/digest.js.map +1 -0
- package/dist/core/gherkin/emit.js +177 -0
- package/dist/core/gherkin/emit.js.map +1 -0
- package/dist/core/gherkin/read.js +76 -0
- package/dist/core/gherkin/read.js.map +1 -0
- package/dist/core/gherkin/stale.js +234 -0
- package/dist/core/gherkin/stale.js.map +1 -0
- package/dist/core/gherkin/stamp.js +77 -0
- package/dist/core/gherkin/stamp.js.map +1 -0
- package/dist/core/gherkin/steps/catalogue.js +154 -0
- package/dist/core/gherkin/steps/catalogue.js.map +1 -0
- package/dist/core/gherkin/steps/inventory.js +98 -0
- package/dist/core/gherkin/steps/inventory.js.map +1 -0
- package/dist/core/gherkin/steps/phrase.js +72 -0
- package/dist/core/gherkin/steps/phrase.js.map +1 -0
- package/dist/core/glossary/delta.js +106 -0
- package/dist/core/glossary/delta.js.map +1 -0
- package/dist/core/glossary/tree.js +86 -0
- package/dist/core/glossary/tree.js.map +1 -0
- package/dist/core/kernel/concurrency.js.map +1 -0
- package/dist/core/{document-bytes.js → kernel/document-bytes.js} +1 -1
- package/dist/core/kernel/document-bytes.js.map +1 -0
- package/dist/core/kernel/fences.js +42 -0
- package/dist/core/kernel/fences.js.map +1 -0
- package/dist/core/kernel/ids/capability.js +72 -0
- package/dist/core/kernel/ids/capability.js.map +1 -0
- package/dist/core/kernel/ids/dirs.js +33 -0
- package/dist/core/kernel/ids/dirs.js.map +1 -0
- package/dist/core/kernel/ids/feature.js +75 -0
- package/dist/core/kernel/ids/feature.js.map +1 -0
- package/dist/core/kernel/ids/service.js +156 -0
- package/dist/core/kernel/ids/service.js.map +1 -0
- package/dist/core/kernel/ids/subsystem.js +63 -0
- package/dist/core/kernel/ids/subsystem.js.map +1 -0
- package/dist/core/{path-safety.js → kernel/path-safety.js} +18 -4
- package/dist/core/kernel/path-safety.js.map +1 -0
- package/dist/core/kernel/records.js.map +1 -0
- package/dist/core/links/backlinks.js +68 -0
- package/dist/core/links/backlinks.js.map +1 -0
- package/dist/core/links/case.js +74 -0
- package/dist/core/links/case.js.map +1 -0
- package/dist/core/links/corpus.js +104 -0
- package/dist/core/links/corpus.js.map +1 -0
- package/dist/core/links/findings.js +110 -0
- package/dist/core/links/findings.js.map +1 -0
- package/dist/core/links/parse.js +236 -0
- package/dist/core/links/parse.js.map +1 -0
- package/dist/core/mcp/argv.js +111 -0
- package/dist/core/mcp/argv.js.map +1 -0
- package/dist/core/mcp/author-tools.js +72 -0
- package/dist/core/mcp/author-tools.js.map +1 -0
- package/dist/core/mcp/framing.js +46 -0
- package/dist/core/mcp/framing.js.map +1 -0
- package/dist/core/mcp/protocol.js +280 -0
- package/dist/core/mcp/protocol.js.map +1 -0
- package/dist/core/mcp/tools.js +314 -0
- package/dist/core/mcp/tools.js.map +1 -0
- package/dist/core/obligations/obligations.js +106 -0
- package/dist/core/obligations/obligations.js.map +1 -0
- package/dist/core/openapi/baseline/gate.js +166 -0
- package/dist/core/openapi/baseline/gate.js.map +1 -0
- package/dist/core/openapi/baseline/plan.js +112 -0
- package/dist/core/openapi/baseline/plan.js.map +1 -0
- package/dist/core/openapi/baseline/record.js +175 -0
- package/dist/core/openapi/baseline/record.js.map +1 -0
- package/dist/core/openapi/depth.js +122 -0
- package/dist/core/openapi/depth.js.map +1 -0
- package/dist/core/openapi/digest.js +189 -0
- package/dist/core/openapi/digest.js.map +1 -0
- package/dist/core/{openapi.js → openapi/doc.js} +44 -106
- package/dist/core/openapi/doc.js.map +1 -0
- package/dist/core/openapi/merge/components.js +234 -0
- package/dist/core/openapi/merge/components.js.map +1 -0
- package/dist/core/openapi/merge/error.js +26 -0
- package/dist/core/openapi/merge/error.js.map +1 -0
- package/dist/core/openapi/merge/markers.js +208 -0
- package/dist/core/openapi/merge/markers.js.map +1 -0
- package/dist/core/openapi/merge/merge.js +256 -0
- package/dist/core/openapi/merge/merge.js.map +1 -0
- package/dist/core/openapi/merge/pin.js +128 -0
- package/dist/core/openapi/merge/pin.js.map +1 -0
- package/dist/core/openspec/decide/capabilities.js +244 -0
- package/dist/core/openspec/decide/capabilities.js.map +1 -0
- package/dist/core/openspec/decide/dispositions.js +63 -0
- package/dist/core/openspec/decide/dispositions.js.map +1 -0
- package/dist/core/openspec/decide/renames.js +179 -0
- package/dist/core/openspec/decide/renames.js.map +1 -0
- package/dist/core/openspec/decide/verdict.js +84 -0
- package/dist/core/openspec/decide/verdict.js.map +1 -0
- package/dist/core/openspec/inventory.js +221 -0
- package/dist/core/openspec/inventory.js.map +1 -0
- package/dist/core/openspec/model/mapping.js +76 -0
- package/dist/core/openspec/model/mapping.js.map +1 -0
- package/dist/core/openspec/model/model.js +65 -0
- package/dist/core/openspec/model/model.js.map +1 -0
- package/dist/core/openspec/scan/changes.js +235 -0
- package/dist/core/openspec/scan/changes.js.map +1 -0
- package/dist/core/openspec/scan/config.js +200 -0
- package/dist/core/openspec/scan/config.js.map +1 -0
- package/dist/core/openspec/scan/shape.js +260 -0
- package/dist/core/openspec/scan/shape.js.map +1 -0
- package/dist/core/openspec/scan/walk.js +133 -0
- package/dist/core/openspec/scan/walk.js.map +1 -0
- package/dist/core/openspec/scan/workspace.js +71 -0
- package/dist/core/openspec/scan/workspace.js.map +1 -0
- package/dist/core/owners/codeowners.js +141 -0
- package/dist/core/owners/codeowners.js.map +1 -0
- package/dist/core/pack/features.js +120 -0
- package/dist/core/pack/features.js.map +1 -0
- package/dist/core/pack/joins.js +112 -0
- package/dist/core/pack/joins.js.map +1 -0
- package/dist/core/pack/living.js +118 -0
- package/dist/core/pack/living.js.map +1 -0
- package/dist/core/pack/pack.js +76 -0
- package/dist/core/pack/pack.js.map +1 -0
- package/dist/core/permissions/permissions.js +87 -0
- package/dist/core/permissions/permissions.js.map +1 -0
- package/dist/core/projection/api.js +84 -0
- package/dist/core/projection/api.js.map +1 -0
- package/dist/core/projection/arch-slice.js +63 -0
- package/dist/core/projection/arch-slice.js.map +1 -0
- package/dist/core/projection/events.js +34 -0
- package/dist/core/projection/events.js.map +1 -0
- package/dist/core/provenance/findings.js +208 -0
- package/dist/core/provenance/findings.js.map +1 -0
- package/dist/core/provenance/git.js +225 -0
- package/dist/core/provenance/git.js.map +1 -0
- package/dist/core/provenance/gitq/moves.js +182 -0
- package/dist/core/provenance/gitq/moves.js.map +1 -0
- package/dist/core/provenance/gitq/vouched-ancestor.js +179 -0
- package/dist/core/provenance/gitq/vouched-ancestor.js.map +1 -0
- package/dist/core/provenance/sample/scope.js +238 -0
- package/dist/core/provenance/sample/scope.js.map +1 -0
- package/dist/core/provenance/sample/sections.js +61 -0
- package/dist/core/provenance/sample/sections.js.map +1 -0
- package/dist/core/provenance/sources.js +263 -0
- package/dist/core/provenance/sources.js.map +1 -0
- package/dist/core/provenance/stamp.js +232 -0
- package/dist/core/provenance/stamp.js.map +1 -0
- package/dist/core/provenance/walk.js +157 -0
- package/dist/core/provenance/walk.js.map +1 -0
- package/dist/core/repo/authored/paths.js +192 -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 +236 -0
- package/dist/core/repo/paths.js.map +1 -0
- package/dist/core/repo/repo.js +248 -0
- package/dist/core/repo/repo.js.map +1 -0
- package/dist/core/repo/service-target.js +153 -0
- package/dist/core/repo/service-target.js.map +1 -0
- package/dist/core/repo/state.js +58 -0
- package/dist/core/repo/state.js.map +1 -0
- package/dist/core/repo/tree/find.js +52 -0
- package/dist/core/repo/tree/find.js.map +1 -0
- package/dist/core/repo/tree/fs.js +64 -0
- package/dist/core/repo/tree/fs.js.map +1 -0
- package/dist/core/repo/tree/marker.js +61 -0
- package/dist/core/repo/tree/marker.js.map +1 -0
- package/dist/core/repo/tree/views.js +172 -0
- package/dist/core/repo/tree/views.js.map +1 -0
- package/dist/core/repo/tree/walk.js +234 -0
- package/dist/core/repo/tree/walk.js.map +1 -0
- package/dist/core/results.js +99 -2
- package/dist/core/results.js.map +1 -1
- package/dist/core/scaffold/landscape.js +131 -0
- package/dist/core/scaffold/landscape.js.map +1 -0
- package/dist/core/scaffold/readme.js +84 -0
- package/dist/core/scaffold/readme.js.map +1 -0
- package/dist/core/staging/commit.js +241 -0
- package/dist/core/staging/commit.js.map +1 -0
- package/dist/core/staging/interrupted.js +96 -0
- package/dist/core/staging/interrupted.js.map +1 -0
- package/dist/core/staging/lock.js +206 -0
- package/dist/core/staging/lock.js.map +1 -0
- package/dist/core/staging/recovery/finding.js +35 -0
- package/dist/core/staging/recovery/finding.js.map +1 -0
- package/dist/core/staging/recovery/intent.js +98 -0
- package/dist/core/staging/recovery/intent.js.map +1 -0
- package/dist/core/staging/recovery/recover.js +126 -0
- package/dist/core/staging/recovery/recover.js.map +1 -0
- package/dist/core/staging/recovery/residue.js +62 -0
- package/dist/core/staging/recovery/residue.js.map +1 -0
- package/dist/core/staging/snapshot.js +202 -0
- package/dist/core/staging/snapshot.js.map +1 -0
- package/dist/core/staging/txn/forward.js +171 -0
- package/dist/core/staging/txn/forward.js.map +1 -0
- package/dist/core/staging/txn/journal.js +139 -0
- package/dist/core/staging/txn/journal.js.map +1 -0
- package/dist/core/staging/txn/transaction.js +75 -0
- package/dist/core/staging/txn/transaction.js.map +1 -0
- package/dist/core/staging/writes.js +113 -0
- package/dist/core/staging/writes.js.map +1 -0
- package/dist/core/status/actions/execution.js +49 -0
- package/dist/core/status/actions/execution.js.map +1 -0
- package/dist/core/status/contracts.js +102 -0
- package/dist/core/status/contracts.js.map +1 -0
- package/dist/core/status/feature/artifacts.js +171 -0
- package/dist/core/status/feature/artifacts.js.map +1 -0
- package/dist/core/status/feature/feature.js +207 -0
- package/dist/core/status/feature/feature.js.map +1 -0
- package/dist/core/status/feature/next.js +150 -0
- package/dist/core/status/feature/next.js.map +1 -0
- package/dist/core/status/feature/state.js +21 -0
- package/dist/core/status/feature/state.js.map +1 -0
- package/dist/core/status/fleet/fleet.js +187 -0
- package/dist/core/status/fleet/fleet.js.map +1 -0
- package/dist/core/status/fleet/next.js +207 -0
- package/dist/core/status/fleet/next.js.map +1 -0
- package/dist/core/status/interrupted.js +97 -0
- package/dist/core/status/interrupted.js.map +1 -0
- package/dist/core/status/report.js +31 -0
- package/dist/core/status/report.js.map +1 -0
- package/dist/core/status/scan.js +41 -0
- package/dist/core/status/scan.js.map +1 -0
- package/dist/core/status/verification.js +201 -0
- package/dist/core/status/verification.js.map +1 -0
- package/dist/core/usecases/capability.js +169 -0
- package/dist/core/usecases/capability.js.map +1 -0
- package/dist/core/usecases/delta/claims.js +116 -0
- package/dist/core/usecases/delta/claims.js.map +1 -0
- package/dist/core/usecases/delta/flows.js +103 -0
- package/dist/core/usecases/delta/flows.js.map +1 -0
- package/dist/core/usecases/delta/overlay.js +235 -0
- package/dist/core/usecases/delta/overlay.js.map +1 -0
- package/dist/core/usecases/fleet.js +137 -0
- package/dist/core/usecases/fleet.js.map +1 -0
- package/dist/core/usecases/operations.js +111 -0
- package/dist/core/usecases/operations.js.map +1 -0
- package/dist/core/usecases/place.js +44 -0
- package/dist/core/usecases/place.js.map +1 -0
- package/dist/core/usecases/touch.js +101 -0
- package/dist/core/usecases/touch.js.map +1 -0
- package/dist/core/verify/answers.js +173 -0
- package/dist/core/verify/answers.js.map +1 -0
- package/dist/core/verify/build.js +150 -0
- package/dist/core/verify/build.js.map +1 -0
- package/dist/core/verify/checklist.js +201 -0
- package/dist/core/verify/checklist.js.map +1 -0
- package/dist/core/verify/claims/identity.js +61 -0
- package/dist/core/verify/claims/identity.js.map +1 -0
- package/dist/core/verify/cross/diff.js +97 -0
- package/dist/core/verify/cross/diff.js.map +1 -0
- package/dist/core/verify/evidence/contract.js +169 -0
- package/dist/core/verify/evidence/contract.js.map +1 -0
- package/dist/core/verify/file.js +257 -0
- package/dist/core/verify/file.js.map +1 -0
- package/dist/core/verify/pins/lint.js +157 -0
- package/dist/core/verify/pins/lint.js.map +1 -0
- package/dist/core/verify/pins/pin.js +95 -0
- package/dist/core/verify/pins/pin.js.map +1 -0
- package/dist/core/verify/record.js +142 -0
- package/dist/core/verify/record.js.map +1 -0
- package/dist/core/verify/store/commit.js +89 -0
- package/dist/core/verify/store/commit.js.map +1 -0
- package/dist/core/verify/store/render.js +57 -0
- package/dist/core/verify/store/render.js.map +1 -0
- package/dist/core/vocabulary/health.js +91 -0
- package/dist/core/vocabulary/health.js.map +1 -0
- package/dist/core/vocabulary/issue.js +55 -0
- package/dist/core/vocabulary/issue.js.map +1 -0
- package/dist/core/vocabulary/maturity.js +145 -0
- package/dist/core/vocabulary/maturity.js.map +1 -0
- package/dist/core/{report.js → vocabulary/report.js} +30 -2
- package/dist/core/vocabulary/report.js.map +1 -0
- package/dist/core/vocabulary/steps.js +266 -0
- package/dist/core/vocabulary/steps.js.map +1 -0
- package/dist/core/workspace/discover.js +239 -0
- package/dist/core/workspace/discover.js.map +1 -0
- package/dist/core/workspace/render.js +52 -0
- package/dist/core/workspace/render.js.map +1 -0
- package/examples/README.md +189 -0
- package/examples/docs/architecture/adrs/0001-transactional-outbox.md +33 -0
- package/examples/docs/architecture/capabilities.yaml +31 -0
- package/examples/docs/architecture/landscape.likec4 +280 -0
- package/examples/docs/architecture/obligations.yaml +23 -0
- package/examples/docs/architecture/permissions.yaml +50 -0
- package/examples/docs/architecture/subsystems.likec4 +11 -0
- package/examples/docs/architecture/usecases/order-notification.likec4 +65 -0
- package/examples/docs/capabilities/checkout/spec.md +55 -0
- package/examples/docs/capabilities/identity/tokens/spec.md +42 -0
- package/examples/docs/capabilities/order-notifications/spec.md +43 -0
- package/examples/docs/features/FEAT-101-payment-splitting/adrs/0001-dedicated-split-service.md +18 -0
- package/examples/docs/features/FEAT-101-payment-splitting/delta.likec4 +94 -0
- package/examples/docs/features/FEAT-101-payment-splitting/intent.md +44 -0
- package/examples/docs/features/FEAT-101-payment-splitting/specs/checkout-web/spec.md +21 -0
- package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-service/asyncapi.yaml +129 -0
- package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-service/spec.md +36 -0
- package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-split-service/arch.spec.md +40 -0
- package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-split-service/openapi.yaml +116 -0
- package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-split-service/spec.md +55 -0
- package/examples/docs/features/FEAT-112-retire-order-v1/intent.md +35 -0
- package/examples/docs/features/FEAT-112-retire-order-v1/specs/order-service/openapi.yaml +28 -0
- package/examples/docs/features/FEAT-112-retire-order-v1/specs/order-service/spec.md +17 -0
- package/examples/docs/features/archive/FEAT-088-refunds/.loam-before/files/architecture/landscape.likec4 +253 -0
- package/examples/docs/features/archive/FEAT-088-refunds/.loam-before/files/services/order-service/spec.md +121 -0
- package/examples/docs/features/archive/FEAT-088-refunds/.loam-before/files/services/payment-service/openapi.yaml +111 -0
- package/examples/docs/features/archive/FEAT-088-refunds/.loam-before/files/services/payment-service/spec.md +58 -0
- package/examples/docs/features/archive/FEAT-088-refunds/.loam-before/manifest.json +32 -0
- package/examples/docs/features/archive/FEAT-088-refunds/adrs/0001-refunds-stay-in-payment-service.md +26 -0
- package/examples/docs/features/archive/FEAT-088-refunds/delta.likec4 +28 -0
- package/examples/docs/features/archive/FEAT-088-refunds/intent.md +26 -0
- package/examples/docs/features/archive/FEAT-088-refunds/specs/order-service/spec.md +37 -0
- package/examples/docs/features/archive/FEAT-088-refunds/specs/payment-service/openapi.yaml +70 -0
- package/examples/docs/features/archive/FEAT-088-refunds/specs/payment-service/spec.md +23 -0
- package/examples/docs/features/archive/FEAT-088-refunds/verification.yaml +76 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/files/architecture/landscape.likec4 +275 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/files/services/payment-service/asyncapi.yaml +96 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/files/services/payment-service/spec.md +82 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/files/services/platform/notification-service/asyncapi.yaml +164 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/files/services/platform/notification-service/spec.md +91 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/manifest.json +46 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/delta.likec4 +36 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/intent.md +22 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/scenario-report.json +10 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/specs/notification-service/asyncapi.yaml +208 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/specs/notification-service/spec.md +24 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/specs/payment-service/asyncapi.yaml +137 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/specs/payment-service/spec.md +31 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/verification.yaml +84 -0
- package/examples/docs/glossary/order.md +15 -0
- package/examples/docs/glossary/payments/authorization.md +14 -0
- package/examples/docs/likec4.config.json +9 -0
- package/examples/docs/loam.json +3 -0
- package/examples/docs/services/checkout-web/model.likec4 +109 -0
- package/examples/docs/services/checkout-web/spec.md +91 -0
- package/examples/docs/services/checkout-web/ui/pages/checkout.page.yaml +40 -0
- package/examples/docs/services/checkout-web/ui/pages/order-status.page.yaml +24 -0
- package/examples/docs/services/checkout-web/ui/pages/split-payment.page.yaml +26 -0
- package/examples/docs/services/order-service/adrs/0001-orchestrated-order-lifecycle.md +52 -0
- package/examples/docs/services/order-service/arch.spec.md +127 -0
- package/examples/docs/services/order-service/asyncapi.yaml +108 -0
- package/examples/docs/services/order-service/health.yaml +57 -0
- package/examples/docs/services/order-service/model.likec4 +138 -0
- package/examples/docs/services/order-service/openapi.yaml +257 -0
- package/examples/docs/services/order-service/runbook.md +62 -0
- package/examples/docs/services/order-service/spec.md +134 -0
- package/examples/docs/services/payment-service/adrs/0001-payments-outbox.md +18 -0
- package/examples/docs/services/payment-service/adrs/0002-idempotency-keys-on-authorization.md +27 -0
- package/examples/docs/services/payment-service/arch.spec.md +73 -0
- package/examples/docs/services/payment-service/asyncapi.yaml +130 -0
- package/examples/docs/services/payment-service/health.yaml +39 -0
- package/examples/docs/services/payment-service/model.likec4 +67 -0
- package/examples/docs/services/payment-service/openapi.yaml +151 -0
- package/examples/docs/services/payment-service/runbook.md +37 -0
- package/examples/docs/services/payment-service/spec.md +88 -0
- package/examples/docs/services/platform/identity-service/adrs/0001-token-introspection-over-local-validation.md +60 -0
- package/examples/docs/services/platform/identity-service/arch.spec.md +117 -0
- package/examples/docs/services/platform/identity-service/health.yaml +70 -0
- package/examples/docs/services/platform/identity-service/model.likec4 +83 -0
- package/examples/docs/services/platform/identity-service/openapi.yaml +197 -0
- package/examples/docs/services/platform/identity-service/runbook.md +95 -0
- package/examples/docs/services/platform/identity-service/spec.md +119 -0
- package/examples/docs/services/platform/notification-service/asyncapi.yaml +199 -0
- package/examples/docs/services/platform/notification-service/health.yaml +35 -0
- package/examples/docs/services/platform/notification-service/model.likec4 +118 -0
- package/examples/docs/services/platform/notification-service/runbook.md +48 -0
- package/examples/docs/services/platform/notification-service/spec.md +112 -0
- package/examples/docs/services/platform/subsystem.yaml +2 -0
- package/examples/fleet.yaml +57 -0
- package/package.json +19 -6
- package/dist/commands/adopt.js +0 -240
- package/dist/commands/adopt.js.map +0 -1
- package/dist/commands/archive.js +0 -1313
- package/dist/commands/archive.js.map +0 -1
- package/dist/commands/delta.js +0 -388
- package/dist/commands/delta.js.map +0 -1
- package/dist/commands/docs-repo-gate.js.map +0 -1
- package/dist/commands/format.js +0 -17
- package/dist/commands/format.js.map +0 -1
- package/dist/commands/gherkin.js +0 -309
- package/dist/commands/gherkin.js.map +0 -1
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/list.js +0 -291
- package/dist/commands/list.js.map +0 -1
- package/dist/commands/migrate-openspec.js +0 -950
- package/dist/commands/migrate-openspec.js.map +0 -1
- package/dist/commands/new.js +0 -413
- package/dist/commands/new.js.map +0 -1
- package/dist/commands/rebase.js +0 -356
- package/dist/commands/rebase.js.map +0 -1
- package/dist/commands/show.js.map +0 -1
- package/dist/commands/status.js +0 -254
- package/dist/commands/status.js.map +0 -1
- package/dist/commands/unarchive.js.map +0 -1
- package/dist/commands/validate.js +0 -1591
- 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 -343
- package/dist/commands/vouch.js.map +0 -1
- package/dist/core/agent.js +0 -2065
- package/dist/core/agent.js.map +0 -1
- package/dist/core/agents-stamp.js +0 -68
- 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/brief.js +0 -733
- 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 -559
- package/dist/core/doctor.js.map +0 -1
- package/dist/core/document-bytes.js.map +0 -1
- package/dist/core/explore.js.map +0 -1
- package/dist/core/frontmatter.js.map +0 -1
- package/dist/core/gherkin.js +0 -463
- package/dist/core/gherkin.js.map +0 -1
- package/dist/core/health.js +0 -67
- package/dist/core/health.js.map +0 -1
- package/dist/core/ids.js +0 -122
- package/dist/core/ids.js.map +0 -1
- package/dist/core/issue.js +0 -9
- package/dist/core/issue.js.map +0 -1
- package/dist/core/json.js +0 -74
- package/dist/core/json.js.map +0 -1
- package/dist/core/likec4.js +0 -479
- 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 -720
- package/dist/core/provenance.js.map +0 -1
- package/dist/core/records.js.map +0 -1
- package/dist/core/repo.js +0 -436
- package/dist/core/repo.js.map +0 -1
- package/dist/core/report.js.map +0 -1
- package/dist/core/spec.js +0 -481
- 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 -1104
- package/dist/core/status.js.map +0 -1
- package/dist/core/steps.js +0 -72
- package/dist/core/steps.js.map +0 -1
- package/dist/core/verify.js +0 -807
- package/dist/core/verify.js.map +0 -1
- package/dist/core/version.js.map +0 -1
- /package/dist/core/{concurrency.js → kernel/concurrency.js} +0 -0
- /package/dist/core/{records.js → kernel/records.js} +0 -0
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What loam REFUSES: the OpenSpec migration surface, the containment and
|
|
3
|
+
* unreadable-file findings, and the error-envelope codes. What happens to a
|
|
4
|
+
* SHIPPED change — the archive gate, unarchive, and dropping a feature — is
|
|
5
|
+
* the continuation section in ./shipped/archive-gate.ts, split there because
|
|
6
|
+
* the two subjects had grown past one file's ceiling.
|
|
7
|
+
*
|
|
8
|
+
* Codes here are LISTED by the command that raises them, not glossed; the
|
|
9
|
+
* meanings come from `loam explain <code>`, out of the running binary. See
|
|
10
|
+
* ./command-map.ts's header for why the duplicated gloss left.
|
|
11
|
+
*
|
|
12
|
+
* THE ONE EXCEPTION IS THE FIRST BULLET. `loam explain` cannot answer
|
|
13
|
+
* `openspec.*` or `mapping.*` — those commands grade a repository still in
|
|
14
|
+
* another tool's shape, before it has a governed loop to look a code up from,
|
|
15
|
+
* and the catalogue leaves them unanswered for that reason. Pointing this
|
|
16
|
+
* section's reader at an explanation that does not exist is the exact failure
|
|
17
|
+
* the pointer exists to prevent, so the migration notes stay written out here
|
|
18
|
+
* until the catalogue reaches them. test/agent-contract.test.ts enforces the
|
|
19
|
+
* boundary from the other side: every OTHER code backticked in AGENTS_MD must
|
|
20
|
+
* resolve, so a family can never quietly lose its gloss and its explanation
|
|
21
|
+
* at once.
|
|
22
|
+
*
|
|
23
|
+
* One section of the AGENTS.md template. ../agents-md.ts assembles the
|
|
24
|
+
* document by PLAIN CONCATENATION — no join separator — so every section
|
|
25
|
+
* starts at the first character of its opening line and ends with the newline
|
|
26
|
+
* that closes its last one. Keep that shape when editing, or two sections glue
|
|
27
|
+
* onto one line in every docs repo loam scaffolds from now on.
|
|
28
|
+
*/
|
|
29
|
+
export const REFUSALS = `- \`loam audit-openspec <root>\` is the read-only OpenSpec inventory; an explicit
|
|
30
|
+
\`--write-mapping\` writes a non-overwriting, digest-bound decision skeleton
|
|
31
|
+
outside the source tree. \`loam migrate-openspec <root> --map <file>\` validates
|
|
32
|
+
that mapping and stays dry-run unless both \`--apply\` and an empty \`--target\`
|
|
33
|
+
are supplied. Living/active shape diagnostics are \`openspec.workspace-empty\`
|
|
34
|
+
(the audited root holds no living spec and no active change, so there is
|
|
35
|
+
nothing to migrate and no verdict over it can be \`ready\`),
|
|
36
|
+
\`openspec.specs-missing\`,
|
|
37
|
+
\`openspec.config-invalid\`, \`openspec.external-store-pointer\`,
|
|
38
|
+
\`openspec.living-empty\`, \`openspec.living-requirements-outside-section\`,
|
|
39
|
+
\`openspec.living-delta-section\`, \`openspec.nonstandard-living-spec\` (markdown
|
|
40
|
+
under \`specs/\` named neither spec.md nor design.md, so no capability reads
|
|
41
|
+
it), \`openspec.change-metadata-invalid\`,
|
|
42
|
+
\`openspec.change-schema-unresolved\`, \`openspec.skip-specs-with-specs\`,
|
|
43
|
+
\`openspec.change-no-specs\`, \`openspec.change-empty\`,
|
|
44
|
+
\`openspec.change-without-delta-sections\`,
|
|
45
|
+
\`openspec.change-requirements-outside-delta-sections\`,
|
|
46
|
+
\`openspec.change-quoted-requirements\` (requirements under a \`## Requirements\`
|
|
47
|
+
heading INSIDE a change delta — the shape OpenSpec's own living-spec template
|
|
48
|
+
mandates, and one that stages nothing, so loam refuses it rather than counting
|
|
49
|
+
requirements it cannot route),
|
|
50
|
+
\`openspec.hidden-change-directory\` (a dot-prefixed directory under
|
|
51
|
+
\`changes/\` is not enumerated as a change, so nothing under it migrates —
|
|
52
|
+
rename it or move it out; under \`changes/archive/\` the same code is an archive
|
|
53
|
+
diagnostic and does not gate, because frozen history never blocks),
|
|
54
|
+
\`openspec.nonstandard-change-spec\`, \`openspec.renamed-malformed\`,
|
|
55
|
+
\`openspec.requirement-id-invalid\`, \`openspec.requirement-id-repeated\`,
|
|
56
|
+
\`openspec.requirement-id-duplicate\` (a stable \`Requirement-ID\` that is
|
|
57
|
+
malformed, declared twice, or shared by two requirements — identity is never
|
|
58
|
+
inferred from an invalid declaration, so the RENAMED chain cannot be followed
|
|
59
|
+
through it), \`openspec.symlink-unsupported\`, and \`openspec.non-utf8-artifact\`;
|
|
60
|
+
the same shapes in frozen history are non-blocking archive diagnostics.
|
|
61
|
+
Mapping refuses stale or incomplete decisions under \`mapping.source-missing\`,
|
|
62
|
+
\`mapping.source-root-mismatch\`, \`mapping.source-digest-mismatch\`,
|
|
63
|
+
\`mapping.unknown-capability\`, \`mapping.unknown-requirement\`,
|
|
64
|
+
\`mapping.requirement-allocation-missing\`,
|
|
65
|
+
\`mapping.requirement-service-unknown\`, \`mapping.service-allocation-empty\`,
|
|
66
|
+
\`mapping.unknown-change\`, \`mapping.change-title-missing\`,
|
|
67
|
+
\`mapping.feature-id-invalid\`, \`mapping.feature-id-duplicate\`,
|
|
68
|
+
\`mapping.unknown-rename\`, \`mapping.invalid-requirement-id\`,
|
|
69
|
+
\`mapping.rename-source-missing\`, \`mapping.rename-source-ambiguous\`,
|
|
70
|
+
\`mapping.rename-source-id-invalid\`, \`mapping.rename-target-conflict\`,
|
|
71
|
+
\`mapping.rename-existing-id-conflict\`, \`mapping.rename-id-conflict\`,
|
|
72
|
+
\`mapping.rename-double-source\`, \`mapping.rename-double-target\`,
|
|
73
|
+
\`mapping.rename-chain\`,
|
|
74
|
+
\`mapping.unknown-artifact\`, and \`mapping.invalid-artifact-disposition\`.
|
|
75
|
+
- Repository containment failures are explicit: \`sources.path-outside\` rejects a
|
|
76
|
+
provenance source outside the service repo and \`gherkin.path-outside\` rejects a
|
|
77
|
+
generated-suite target outside it. Federated verify recording refuses under
|
|
78
|
+
\`service-mismatch\`, \`unknown-service\` or \`repository-unavailable\` when the
|
|
79
|
+
selected service, fleet identity and repository commit cannot be bound safely,
|
|
80
|
+
and under \`record-federated\` when the legacy all-at-once form would erase other
|
|
81
|
+
repositories' attestations. \`loam gherkin --service <id>\` and
|
|
82
|
+
\`loam vouch --service <id>\` answer that same wrong-repo pair
|
|
83
|
+
(\`repository-unavailable\`, \`service-mismatch\`) for the same reason. Neither is
|
|
84
|
+
\`invalid-option\`: the flags were right and the directory was wrong, so the fix
|
|
85
|
+
is to re-run in the service's own checkout, never to re-read the invocation.
|
|
86
|
+
- A file loam cannot read is reported, never skipped: \`service.unreadable\` and
|
|
87
|
+
\`feature.unreadable\` (both errors) name the path and say that nothing about
|
|
88
|
+
that target was checked while the rest of the fleet still was. The whole docs
|
|
89
|
+
repo being unreachable is a refusal instead: \`docs-missing\` or
|
|
90
|
+
\`services-missing\`.
|
|
91
|
+
- Both modes read frontmatter (\`frontmatter.missing\`, \`frontmatter.malformed\`,
|
|
92
|
+
\`frontmatter.field-mismatch\`,
|
|
93
|
+
\`frontmatter.status-unknown\`, \`frontmatter.field-missing\`); a service's spec.md —
|
|
94
|
+
and its arch.spec.md, same conventions — additionally carries the sources chain
|
|
95
|
+
(\`sources.absent\`, \`sources.path-missing\`, \`sources.empty\`, \`sources.skipped\`,
|
|
96
|
+
\`sources.unvouched\`, \`sources.stale\`) plus the two doc-side checks,
|
|
97
|
+
\`content.stale\` and \`sources.sampled-vouch\`, which need no service repo and so
|
|
98
|
+
fire from the docs repo too.
|
|
99
|
+
- A service target run from the service's own repository also re-checks the
|
|
100
|
+
\`evidence_pins\` its federated verification records carry, against the working
|
|
101
|
+
tree: \`evidence.checked\` and \`evidence.unpinned\` are the confirmations,
|
|
102
|
+
\`evidence.unresolved\`, \`evidence.moved\`, \`evidence.line-changed\`,
|
|
103
|
+
\`evidence.token-missing\` and \`evidence.record-unreadable\` the warnings.
|
|
104
|
+
Demote-only, by doctrine: a warn here is a reading priority for a reviewer,
|
|
105
|
+
never a verdict change — no pin state moves \`attested\` or \`verified\` in
|
|
106
|
+
either direction. From the docs repo the family is silent;
|
|
107
|
+
\`sources.unverifiable-from-here\` already names that blind spot.
|
|
108
|
+
- \`loam archive\` alone reports the breaches only the merge computation can see:
|
|
109
|
+
\`living.requirement-outside-requirements\`, \`openapi.op-modified\`,
|
|
110
|
+
\`openapi.path-item-modified\`, \`openapi.component-modified\`,
|
|
111
|
+
\`openapi.ref-unresolved\`, \`openapi.remove-marker-path-level\`, the event
|
|
112
|
+
axis's own trio \`asyncapi.message-modified\` / \`asyncapi.channel-modified\` /
|
|
113
|
+
\`asyncapi.operation-modified\`, \`asyncapi.ref-unresolved\`,
|
|
114
|
+
\`asyncapi.remove-marker-inline\` and \`service.no-model\`. Two of those are
|
|
115
|
+
graded at validate time as well and are STRICTER here —
|
|
116
|
+
\`openapi.ref-unresolved\` and \`asyncapi.ref-unresolved\` are warnings there and
|
|
117
|
+
errors here, because the merged document is what would carry the dangling
|
|
118
|
+
reference — so \`loam explain\` on either prints both contexts.
|
|
119
|
+
|
|
120
|
+
\`loam validate <target>\` is the positional spelling of the first two: a feature id
|
|
121
|
+
or a service id, tried in that order, so the feature wins when one name could be
|
|
122
|
+
both and \`--service\`/\`--feature\` force the reading. When the name really is both,
|
|
123
|
+
the run says so — \`target.ambiguous\` (warn) names the reading it took and the
|
|
124
|
+
flag that forces the other, and \`--json\` carries \`resolvedKind\` — because a
|
|
125
|
+
silent precedence rule is a report about a target nobody asked for. The
|
|
126
|
+
positional together with \`--all\`, \`--service\` or \`--feature\` is refused
|
|
127
|
+
(\`invalid-option\`).
|
|
128
|
+
|
|
129
|
+
Two rendering levers change nothing else: \`loam validate --errors-only\` drops
|
|
130
|
+
the confirmations from the TEXT view (the \`--json\` payload is byte-identical),
|
|
131
|
+
and \`loam list --needs-work\` narrows the service list to the ones with
|
|
132
|
+
something missing — the adoption worklist. \`loam list --needs-work --review-order\`
|
|
133
|
+
orders that worklist by fan-in — the services the most other services depend on
|
|
134
|
+
first: drawn call edges into each, plus event subscriptions (a drawn \`consumes\`
|
|
135
|
+
edge, or a living \`Consumes:\` line naming a message it sends) — a count, never
|
|
136
|
+
a priority judgement — and its \`--json\` rows then additionally carry \`fanIn\`
|
|
137
|
+
and \`reviewRank\`; without \`--needs-work\` the flag is refused (\`invalid-option\`).
|
|
138
|
+
|
|
139
|
+
Two campaign flags slice that same services section and change nothing about
|
|
140
|
+
any row. \`loam list --subsystem <name>\` limits the listing to the services
|
|
141
|
+
filed under one subsystem, at any depth: \`services[]\`, the \`maturity\` rollup
|
|
142
|
+
and \`subsystems[]\` reflect the slice (\`unfiledServices\` is omitted — it is a
|
|
143
|
+
fleet-root fact), while every per-row fact — \`fanIn\`, \`apiExpected\`,
|
|
144
|
+
\`missing\` — is still computed fleet-wide, so filtering changes which rows
|
|
145
|
+
appear, never what a row says; with \`--review-order\` the filter applies first
|
|
146
|
+
and \`reviewRank\` stays contiguous within the filtered worklist. The name
|
|
147
|
+
\`unfiled\` selects the services filed under no subsystem while nothing in the
|
|
148
|
+
tree claims that name (a real subsystem or service spelled \`unfiled\` wins).
|
|
149
|
+
An unknown name refuses \`unknown-target\` with close-name hints; a service
|
|
150
|
+
name refuses \`invalid-option\`. \`loam list --owners <path>\` joins each listed
|
|
151
|
+
service's directory to the owning teams in the named CODEOWNERS file —
|
|
152
|
+
directory-pattern rules only, last match wins, an owner-less directory rule
|
|
153
|
+
CLEARING ownership for what it matches exactly as the forge reads it; a
|
|
154
|
+
recognised rule outside that subset (any other wildcard use, \`*\` included)
|
|
155
|
+
is reported under \`skippedRules\`, never guessed at — and \`--json\` gains the additive \`owners\`
|
|
156
|
+
key (\`path\`, \`teams[]\` with each team's services in the listing's own
|
|
157
|
+
filtered-and-ordered row order, \`unowned[]\` listing the rows no rule matched,
|
|
158
|
+
\`skippedRules[]\`), so the per-team arrays are the per-team campaign
|
|
159
|
+
worklists. A CODEOWNERS path that cannot be read, or a line that cannot be
|
|
160
|
+
parsed as \`pattern owner…\`, refuses \`owners-unreadable\` naming the path and
|
|
161
|
+
line — fail-closed, exactly as \`answers-unreadable\` treats the other
|
|
162
|
+
user-named file. Either flag with the \`features\` or \`capabilities\` section
|
|
163
|
+
is refused (\`invalid-option\`).
|
|
164
|
+
|
|
165
|
+
\`--strict\` (every targeting mode, \`--all\` included) exits 1 when any error
|
|
166
|
+
or warning exists — \`ok\`-severity findings are confirmations and never trip
|
|
167
|
+
it. It changes the exit code and nothing else:
|
|
168
|
+
\`valid\` still means "no errors", and the \`--json\` payload stays byte-for-byte
|
|
169
|
+
what it was. The stricter grade is a per-invocation lever, visible in the CI
|
|
170
|
+
pipeline that passes the flag — deliberately not a per-repo profile.
|
|
171
|
+
|
|
172
|
+
\`loam delta <FEAT> --json\` exits 1 when either authored document behind the brief
|
|
173
|
+
failed to parse — \`architecture.errors\` non-empty, or \`openapi.unreadable\` true —
|
|
174
|
+
with \`ok: true\` and the full payload intact: the empty C4 slice means the delta
|
|
175
|
+
did not parse, and an empty \`api\` beside \`openapi.unreadable\` means the contract
|
|
176
|
+
delta did not parse, neither of them "this feature changes nothing there". Branch
|
|
177
|
+
on the exit code before consuming either slice as a task brief.
|
|
178
|
+
|
|
179
|
+
Findings with severity \`ok\` are confirmations, not work: \`c4.valid\`, \`delta.valid\`,
|
|
180
|
+
\`requirements.covered\`, \`api.covered\`, \`spine.resolved\`, \`event.covered\`, \`coherence.ok\`,
|
|
181
|
+
\`landscape.matched\`, \`archedge.covered\`, \`sources.resolved\`, \`sources.current\`,
|
|
182
|
+
\`sources.walked\`, \`gherkin.current\`.
|
|
183
|
+
|
|
184
|
+
A finding's \`subject\` names the service it is about. The envelope separates \`ok\` (the
|
|
185
|
+
command ran) from \`valid\` (the docs pass). A refusal is \`ok: false\` with a stable
|
|
186
|
+
\`error.code\`, and \`loam explain <code>\` has the meaning of every one of them. What
|
|
187
|
+
follows is the other half — which command raises which:
|
|
188
|
+
|
|
189
|
+
- Before any command can read anything: \`no-config\`, \`config-invalid\`,
|
|
190
|
+
\`docs-missing\`, \`services-missing\`, \`unknown-target\`, \`invalid-option\`.
|
|
191
|
+
\`invalid-option\` covers flags that contradict each other AND a value that
|
|
192
|
+
cannot be right — a \`loam list\` section that is not services or features, or a
|
|
193
|
+
service id that is not a legal \`services/<id>/\` directory name.
|
|
194
|
+
- Every JOURNALED writer — \`archive\`, \`unarchive\`, \`rebase\`, \`vouch\`, \`new\`,
|
|
195
|
+
\`gherkin\`, \`seed\`, \`subsystem\` and \`verify --record\` — shares one transaction
|
|
196
|
+
and therefore one set of refusals: \`docs-busy\`, \`commit-interrupted\`,
|
|
197
|
+
\`merge-failed\` and \`rollback-incomplete\`. Learn them once and you have read
|
|
198
|
+
them for all nine. \`loam doctor\` names the interrupted state as
|
|
199
|
+
\`doctor.commit-interrupted\` and \`loam validate\` leads every mode with
|
|
200
|
+
\`docs.commit-interrupted\` while the journal sits there; every journaled writer
|
|
201
|
+
recovers a finished predecessor's journal on its next run and reports it as
|
|
202
|
+
\`recovered\` in \`--json\`.
|
|
203
|
+
- \`loam new\`: \`already-exists\` — also the answer when a concurrent \`new\` for the
|
|
204
|
+
same id wins the race.
|
|
205
|
+
- \`loam vouch\`: \`sources-absent\`, \`sources-path-missing\`, \`vouch-raced\`, and the
|
|
206
|
+
wrong-repo pair \`repository-unavailable\` / \`service-mismatch\`, because
|
|
207
|
+
\`sources\` resolve against the service's own checkout and from anywhere else
|
|
208
|
+
those paths are somebody else's.
|
|
209
|
+
- \`loam archive\`: \`not-coherent\`, \`living-outside-requirements\`,
|
|
210
|
+
\`archive-exists\` — see the archive gate below.
|
|
211
|
+
- \`loam unarchive\`: \`feature-active\`, \`snapshot-missing\`, \`snapshot-stale\`,
|
|
212
|
+
\`snapshot-corrupt\`, \`restore-failed\` — see "Taking an archive back".
|
|
213
|
+
- \`loam gherkin\`: \`gherkin-conflict\`, plus the same wrong-repo pair, refused
|
|
214
|
+
before anything is written because the generated files land in the repo loam
|
|
215
|
+
is standing in.
|
|
216
|
+
- \`loam subsystem\`: \`subsystem-not-empty\`, \`move-uncommitted\`, \`move-failed\`,
|
|
217
|
+
and \`unknown-target\` / \`already-exists\` / \`invalid-option\` for names that
|
|
218
|
+
resolve to nothing, collide in the flat namespace, or break the grammar.
|
|
219
|
+
\`move-failed\` is deliberately distinct from \`merge-failed\`: the move's own
|
|
220
|
+
transaction rolled back cleanly, nothing changed, and re-running can work.
|
|
221
|
+
- \`loam verify --record\` / \`--results\` / \`--contract-results\`:
|
|
222
|
+
\`answers-unreadable\`, \`answers-mismatch\`, \`answers-unevidenced\`,
|
|
223
|
+
\`record-federated\`, \`record-unreadable\` and \`record-raced\`. Two records for
|
|
224
|
+
different services land in either order — the later one waits, then merges,
|
|
225
|
+
and both attestations survive.
|
|
226
|
+
- \`loam open\`: \`no-members\`, \`binding-duplicate\`, \`already-exists\` (the
|
|
227
|
+
workspace file, which loam never silently overwrites — pass \`--out\` or
|
|
228
|
+
\`--force\`) and \`invalid-option\`.
|
|
229
|
+
- \`loam seed --from fleet.yaml\`: \`seed-file-invalid\`, \`seed-duplicate-service\`,
|
|
230
|
+
\`seed-unknown-subsystem\`, \`seed-landscape-edited\`, and \`unknown-service\` for a
|
|
231
|
+
call endpoint nothing declares. An existing service directory is never moved,
|
|
232
|
+
and nothing is ever deleted.
|
|
233
|
+
- \`internal\` — an unexpected throw, the one code with no stable meaning.
|
|
234
|
+
|
|
235
|
+
\`--all\` reports a target per service, a target per feature in flight, and one target
|
|
236
|
+
of kind \`landscape\` for the fleet-level checks that belong to no single service.
|
|
237
|
+
|
|
238
|
+
Three different words for three different questions, and no command conflates them:
|
|
239
|
+
\`ok\` — the command ran; \`valid\` — the documents pass (\`validate\`); \`verified\` —
|
|
240
|
+
somebody says the code was built and showed evidence (\`verify\`). A feature can be
|
|
241
|
+
valid and unverified, or verified and incoherent. Read the one you meant.
|
|
242
|
+
`;
|
|
243
|
+
/* The archive gate, unarchive, and dropping a feature continue in
|
|
244
|
+
* ./shipped/archive-gate.ts — one document section split at its own subject
|
|
245
|
+
* seam, concatenated after this one by ../agents-md.ts. */
|
|
246
|
+
//# sourceMappingURL=refusals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refusals.js","sourceRoot":"","sources":["../../../../src/core/agent/agents-md/refusals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqNvB,CAAC;AAEF;;2DAE2D","sourcesContent":["/**\n * What loam REFUSES: the OpenSpec migration surface, the containment and\n * unreadable-file findings, and the error-envelope codes. What happens to a\n * SHIPPED change — the archive gate, unarchive, and dropping a feature — is\n * the continuation section in ./shipped/archive-gate.ts, split there because\n * the two subjects had grown past one file's ceiling.\n *\n * Codes here are LISTED by the command that raises them, not glossed; the\n * meanings come from `loam explain <code>`, out of the running binary. See\n * ./command-map.ts's header for why the duplicated gloss left.\n *\n * THE ONE EXCEPTION IS THE FIRST BULLET. `loam explain` cannot answer\n * `openspec.*` or `mapping.*` — those commands grade a repository still in\n * another tool's shape, before it has a governed loop to look a code up from,\n * and the catalogue leaves them unanswered for that reason. Pointing this\n * section's reader at an explanation that does not exist is the exact failure\n * the pointer exists to prevent, so the migration notes stay written out here\n * until the catalogue reaches them. test/agent-contract.test.ts enforces the\n * boundary from the other side: every OTHER code backticked in AGENTS_MD must\n * resolve, so a family can never quietly lose its gloss and its explanation\n * at once.\n *\n * One section of the AGENTS.md template. ../agents-md.ts assembles the\n * document by PLAIN CONCATENATION — no join separator — so every section\n * starts at the first character of its opening line and ends with the newline\n * that closes its last one. Keep that shape when editing, or two sections glue\n * onto one line in every docs repo loam scaffolds from now on.\n */\nexport const REFUSALS = `- \\`loam audit-openspec <root>\\` is the read-only OpenSpec inventory; an explicit\n \\`--write-mapping\\` writes a non-overwriting, digest-bound decision skeleton\n outside the source tree. \\`loam migrate-openspec <root> --map <file>\\` validates\n that mapping and stays dry-run unless both \\`--apply\\` and an empty \\`--target\\`\n are supplied. Living/active shape diagnostics are \\`openspec.workspace-empty\\`\n (the audited root holds no living spec and no active change, so there is\n nothing to migrate and no verdict over it can be \\`ready\\`),\n \\`openspec.specs-missing\\`,\n \\`openspec.config-invalid\\`, \\`openspec.external-store-pointer\\`,\n \\`openspec.living-empty\\`, \\`openspec.living-requirements-outside-section\\`,\n \\`openspec.living-delta-section\\`, \\`openspec.nonstandard-living-spec\\` (markdown\n under \\`specs/\\` named neither spec.md nor design.md, so no capability reads\n it), \\`openspec.change-metadata-invalid\\`,\n \\`openspec.change-schema-unresolved\\`, \\`openspec.skip-specs-with-specs\\`,\n \\`openspec.change-no-specs\\`, \\`openspec.change-empty\\`,\n \\`openspec.change-without-delta-sections\\`,\n \\`openspec.change-requirements-outside-delta-sections\\`,\n \\`openspec.change-quoted-requirements\\` (requirements under a \\`## Requirements\\`\n heading INSIDE a change delta — the shape OpenSpec's own living-spec template\n mandates, and one that stages nothing, so loam refuses it rather than counting\n requirements it cannot route),\n \\`openspec.hidden-change-directory\\` (a dot-prefixed directory under\n \\`changes/\\` is not enumerated as a change, so nothing under it migrates —\n rename it or move it out; under \\`changes/archive/\\` the same code is an archive\n diagnostic and does not gate, because frozen history never blocks),\n \\`openspec.nonstandard-change-spec\\`, \\`openspec.renamed-malformed\\`,\n \\`openspec.requirement-id-invalid\\`, \\`openspec.requirement-id-repeated\\`,\n \\`openspec.requirement-id-duplicate\\` (a stable \\`Requirement-ID\\` that is\n malformed, declared twice, or shared by two requirements — identity is never\n inferred from an invalid declaration, so the RENAMED chain cannot be followed\n through it), \\`openspec.symlink-unsupported\\`, and \\`openspec.non-utf8-artifact\\`;\n the same shapes in frozen history are non-blocking archive diagnostics.\n Mapping refuses stale or incomplete decisions under \\`mapping.source-missing\\`,\n \\`mapping.source-root-mismatch\\`, \\`mapping.source-digest-mismatch\\`,\n \\`mapping.unknown-capability\\`, \\`mapping.unknown-requirement\\`,\n \\`mapping.requirement-allocation-missing\\`,\n \\`mapping.requirement-service-unknown\\`, \\`mapping.service-allocation-empty\\`,\n \\`mapping.unknown-change\\`, \\`mapping.change-title-missing\\`,\n \\`mapping.feature-id-invalid\\`, \\`mapping.feature-id-duplicate\\`,\n \\`mapping.unknown-rename\\`, \\`mapping.invalid-requirement-id\\`,\n \\`mapping.rename-source-missing\\`, \\`mapping.rename-source-ambiguous\\`,\n \\`mapping.rename-source-id-invalid\\`, \\`mapping.rename-target-conflict\\`,\n \\`mapping.rename-existing-id-conflict\\`, \\`mapping.rename-id-conflict\\`,\n \\`mapping.rename-double-source\\`, \\`mapping.rename-double-target\\`,\n \\`mapping.rename-chain\\`,\n \\`mapping.unknown-artifact\\`, and \\`mapping.invalid-artifact-disposition\\`.\n- Repository containment failures are explicit: \\`sources.path-outside\\` rejects a\n provenance source outside the service repo and \\`gherkin.path-outside\\` rejects a\n generated-suite target outside it. Federated verify recording refuses under\n \\`service-mismatch\\`, \\`unknown-service\\` or \\`repository-unavailable\\` when the\n selected service, fleet identity and repository commit cannot be bound safely,\n and under \\`record-federated\\` when the legacy all-at-once form would erase other\n repositories' attestations. \\`loam gherkin --service <id>\\` and\n \\`loam vouch --service <id>\\` answer that same wrong-repo pair\n (\\`repository-unavailable\\`, \\`service-mismatch\\`) for the same reason. Neither is\n \\`invalid-option\\`: the flags were right and the directory was wrong, so the fix\n is to re-run in the service's own checkout, never to re-read the invocation.\n- A file loam cannot read is reported, never skipped: \\`service.unreadable\\` and\n \\`feature.unreadable\\` (both errors) name the path and say that nothing about\n that target was checked while the rest of the fleet still was. The whole docs\n repo being unreachable is a refusal instead: \\`docs-missing\\` or\n \\`services-missing\\`.\n- Both modes read frontmatter (\\`frontmatter.missing\\`, \\`frontmatter.malformed\\`,\n \\`frontmatter.field-mismatch\\`,\n \\`frontmatter.status-unknown\\`, \\`frontmatter.field-missing\\`); a service's spec.md —\n and its arch.spec.md, same conventions — additionally carries the sources chain\n (\\`sources.absent\\`, \\`sources.path-missing\\`, \\`sources.empty\\`, \\`sources.skipped\\`,\n \\`sources.unvouched\\`, \\`sources.stale\\`) plus the two doc-side checks,\n \\`content.stale\\` and \\`sources.sampled-vouch\\`, which need no service repo and so\n fire from the docs repo too.\n- A service target run from the service's own repository also re-checks the\n \\`evidence_pins\\` its federated verification records carry, against the working\n tree: \\`evidence.checked\\` and \\`evidence.unpinned\\` are the confirmations,\n \\`evidence.unresolved\\`, \\`evidence.moved\\`, \\`evidence.line-changed\\`,\n \\`evidence.token-missing\\` and \\`evidence.record-unreadable\\` the warnings.\n Demote-only, by doctrine: a warn here is a reading priority for a reviewer,\n never a verdict change — no pin state moves \\`attested\\` or \\`verified\\` in\n either direction. From the docs repo the family is silent;\n \\`sources.unverifiable-from-here\\` already names that blind spot.\n- \\`loam archive\\` alone reports the breaches only the merge computation can see:\n \\`living.requirement-outside-requirements\\`, \\`openapi.op-modified\\`,\n \\`openapi.path-item-modified\\`, \\`openapi.component-modified\\`,\n \\`openapi.ref-unresolved\\`, \\`openapi.remove-marker-path-level\\`, the event\n axis's own trio \\`asyncapi.message-modified\\` / \\`asyncapi.channel-modified\\` /\n \\`asyncapi.operation-modified\\`, \\`asyncapi.ref-unresolved\\`,\n \\`asyncapi.remove-marker-inline\\` and \\`service.no-model\\`. Two of those are\n graded at validate time as well and are STRICTER here —\n \\`openapi.ref-unresolved\\` and \\`asyncapi.ref-unresolved\\` are warnings there and\n errors here, because the merged document is what would carry the dangling\n reference — so \\`loam explain\\` on either prints both contexts.\n\n\\`loam validate <target>\\` is the positional spelling of the first two: a feature id\nor a service id, tried in that order, so the feature wins when one name could be\nboth and \\`--service\\`/\\`--feature\\` force the reading. When the name really is both,\nthe run says so — \\`target.ambiguous\\` (warn) names the reading it took and the\nflag that forces the other, and \\`--json\\` carries \\`resolvedKind\\` — because a\nsilent precedence rule is a report about a target nobody asked for. The\npositional together with \\`--all\\`, \\`--service\\` or \\`--feature\\` is refused\n(\\`invalid-option\\`).\n\nTwo rendering levers change nothing else: \\`loam validate --errors-only\\` drops\nthe confirmations from the TEXT view (the \\`--json\\` payload is byte-identical),\nand \\`loam list --needs-work\\` narrows the service list to the ones with\nsomething missing — the adoption worklist. \\`loam list --needs-work --review-order\\`\norders that worklist by fan-in — the services the most other services depend on\nfirst: drawn call edges into each, plus event subscriptions (a drawn \\`consumes\\`\nedge, or a living \\`Consumes:\\` line naming a message it sends) — a count, never\na priority judgement — and its \\`--json\\` rows then additionally carry \\`fanIn\\`\nand \\`reviewRank\\`; without \\`--needs-work\\` the flag is refused (\\`invalid-option\\`).\n\nTwo campaign flags slice that same services section and change nothing about\nany row. \\`loam list --subsystem <name>\\` limits the listing to the services\nfiled under one subsystem, at any depth: \\`services[]\\`, the \\`maturity\\` rollup\nand \\`subsystems[]\\` reflect the slice (\\`unfiledServices\\` is omitted — it is a\nfleet-root fact), while every per-row fact — \\`fanIn\\`, \\`apiExpected\\`,\n\\`missing\\` — is still computed fleet-wide, so filtering changes which rows\nappear, never what a row says; with \\`--review-order\\` the filter applies first\nand \\`reviewRank\\` stays contiguous within the filtered worklist. The name\n\\`unfiled\\` selects the services filed under no subsystem while nothing in the\ntree claims that name (a real subsystem or service spelled \\`unfiled\\` wins).\nAn unknown name refuses \\`unknown-target\\` with close-name hints; a service\nname refuses \\`invalid-option\\`. \\`loam list --owners <path>\\` joins each listed\nservice's directory to the owning teams in the named CODEOWNERS file —\ndirectory-pattern rules only, last match wins, an owner-less directory rule\nCLEARING ownership for what it matches exactly as the forge reads it; a\nrecognised rule outside that subset (any other wildcard use, \\`*\\` included)\nis reported under \\`skippedRules\\`, never guessed at — and \\`--json\\` gains the additive \\`owners\\`\nkey (\\`path\\`, \\`teams[]\\` with each team's services in the listing's own\nfiltered-and-ordered row order, \\`unowned[]\\` listing the rows no rule matched,\n\\`skippedRules[]\\`), so the per-team arrays are the per-team campaign\nworklists. A CODEOWNERS path that cannot be read, or a line that cannot be\nparsed as \\`pattern owner…\\`, refuses \\`owners-unreadable\\` naming the path and\nline — fail-closed, exactly as \\`answers-unreadable\\` treats the other\nuser-named file. Either flag with the \\`features\\` or \\`capabilities\\` section\nis refused (\\`invalid-option\\`).\n\n\\`--strict\\` (every targeting mode, \\`--all\\` included) exits 1 when any error\nor warning exists — \\`ok\\`-severity findings are confirmations and never trip\nit. It changes the exit code and nothing else:\n\\`valid\\` still means \"no errors\", and the \\`--json\\` payload stays byte-for-byte\nwhat it was. The stricter grade is a per-invocation lever, visible in the CI\npipeline that passes the flag — deliberately not a per-repo profile.\n\n\\`loam delta <FEAT> --json\\` exits 1 when either authored document behind the brief\nfailed to parse — \\`architecture.errors\\` non-empty, or \\`openapi.unreadable\\` true —\nwith \\`ok: true\\` and the full payload intact: the empty C4 slice means the delta\ndid not parse, and an empty \\`api\\` beside \\`openapi.unreadable\\` means the contract\ndelta did not parse, neither of them \"this feature changes nothing there\". Branch\non the exit code before consuming either slice as a task brief.\n\nFindings with severity \\`ok\\` are confirmations, not work: \\`c4.valid\\`, \\`delta.valid\\`,\n\\`requirements.covered\\`, \\`api.covered\\`, \\`spine.resolved\\`, \\`event.covered\\`, \\`coherence.ok\\`,\n\\`landscape.matched\\`, \\`archedge.covered\\`, \\`sources.resolved\\`, \\`sources.current\\`,\n\\`sources.walked\\`, \\`gherkin.current\\`.\n\nA finding's \\`subject\\` names the service it is about. The envelope separates \\`ok\\` (the\ncommand ran) from \\`valid\\` (the docs pass). A refusal is \\`ok: false\\` with a stable\n\\`error.code\\`, and \\`loam explain <code>\\` has the meaning of every one of them. What\nfollows is the other half — which command raises which:\n\n- Before any command can read anything: \\`no-config\\`, \\`config-invalid\\`,\n \\`docs-missing\\`, \\`services-missing\\`, \\`unknown-target\\`, \\`invalid-option\\`.\n \\`invalid-option\\` covers flags that contradict each other AND a value that\n cannot be right — a \\`loam list\\` section that is not services or features, or a\n service id that is not a legal \\`services/<id>/\\` directory name.\n- Every JOURNALED writer — \\`archive\\`, \\`unarchive\\`, \\`rebase\\`, \\`vouch\\`, \\`new\\`,\n \\`gherkin\\`, \\`seed\\`, \\`subsystem\\` and \\`verify --record\\` — shares one transaction\n and therefore one set of refusals: \\`docs-busy\\`, \\`commit-interrupted\\`,\n \\`merge-failed\\` and \\`rollback-incomplete\\`. Learn them once and you have read\n them for all nine. \\`loam doctor\\` names the interrupted state as\n \\`doctor.commit-interrupted\\` and \\`loam validate\\` leads every mode with\n \\`docs.commit-interrupted\\` while the journal sits there; every journaled writer\n recovers a finished predecessor's journal on its next run and reports it as\n \\`recovered\\` in \\`--json\\`.\n- \\`loam new\\`: \\`already-exists\\` — also the answer when a concurrent \\`new\\` for the\n same id wins the race.\n- \\`loam vouch\\`: \\`sources-absent\\`, \\`sources-path-missing\\`, \\`vouch-raced\\`, and the\n wrong-repo pair \\`repository-unavailable\\` / \\`service-mismatch\\`, because\n \\`sources\\` resolve against the service's own checkout and from anywhere else\n those paths are somebody else's.\n- \\`loam archive\\`: \\`not-coherent\\`, \\`living-outside-requirements\\`,\n \\`archive-exists\\` — see the archive gate below.\n- \\`loam unarchive\\`: \\`feature-active\\`, \\`snapshot-missing\\`, \\`snapshot-stale\\`,\n \\`snapshot-corrupt\\`, \\`restore-failed\\` — see \"Taking an archive back\".\n- \\`loam gherkin\\`: \\`gherkin-conflict\\`, plus the same wrong-repo pair, refused\n before anything is written because the generated files land in the repo loam\n is standing in.\n- \\`loam subsystem\\`: \\`subsystem-not-empty\\`, \\`move-uncommitted\\`, \\`move-failed\\`,\n and \\`unknown-target\\` / \\`already-exists\\` / \\`invalid-option\\` for names that\n resolve to nothing, collide in the flat namespace, or break the grammar.\n \\`move-failed\\` is deliberately distinct from \\`merge-failed\\`: the move's own\n transaction rolled back cleanly, nothing changed, and re-running can work.\n- \\`loam verify --record\\` / \\`--results\\` / \\`--contract-results\\`:\n \\`answers-unreadable\\`, \\`answers-mismatch\\`, \\`answers-unevidenced\\`,\n \\`record-federated\\`, \\`record-unreadable\\` and \\`record-raced\\`. Two records for\n different services land in either order — the later one waits, then merges,\n and both attestations survive.\n- \\`loam open\\`: \\`no-members\\`, \\`binding-duplicate\\`, \\`already-exists\\` (the\n workspace file, which loam never silently overwrites — pass \\`--out\\` or\n \\`--force\\`) and \\`invalid-option\\`.\n- \\`loam seed --from fleet.yaml\\`: \\`seed-file-invalid\\`, \\`seed-duplicate-service\\`,\n \\`seed-unknown-subsystem\\`, \\`seed-landscape-edited\\`, and \\`unknown-service\\` for a\n call endpoint nothing declares. An existing service directory is never moved,\n and nothing is ever deleted.\n- \\`internal\\` — an unexpected throw, the one code with no stable meaning.\n\n\\`--all\\` reports a target per service, a target per feature in flight, and one target\nof kind \\`landscape\\` for the fleet-level checks that belong to no single service.\n\nThree different words for three different questions, and no command conflates them:\n\\`ok\\` — the command ran; \\`valid\\` — the documents pass (\\`validate\\`); \\`verified\\` —\nsomebody says the code was built and showed evidence (\\`verify\\`). A feature can be\nvalid and unverified, or verified and incoherent. Read the one you meant.\n`;\n\n/* The archive gate, unarchive, and dropping a feature continue in\n * ./shipped/archive-gate.ts — one document section split at its own subject\n * seam, concatenated after this one by ../agents-md.ts. */\n"]}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How a SHIPPED change is gated, undone or dropped: the archive gate,
|
|
3
|
+
* unarchive, and dropping a feature. The continuation of ../refusals.ts —
|
|
4
|
+
* that module holds what loam refuses and the error-envelope codes; this one
|
|
5
|
+
* holds what happens to a feature once the merge is on the table. Split
|
|
6
|
+
* there because the two subjects were one 300-plus-line file, and the file's
|
|
7
|
+
* own header already named them separately.
|
|
8
|
+
*
|
|
9
|
+
* One section of the AGENTS.md template. ../../agents-md.ts assembles the
|
|
10
|
+
* document by PLAIN CONCATENATION — no join separator — so this section
|
|
11
|
+
* starts at the first character of its opening heading and ends with the
|
|
12
|
+
* newline that closes its last line. Keep that shape when editing, or two
|
|
13
|
+
* sections glue onto one line in every docs repo loam scaffolds from now on.
|
|
14
|
+
*/
|
|
15
|
+
export const ARCHIVE_GATE = `## The archive gate
|
|
16
|
+
|
|
17
|
+
The three axes agreeing is called **coherence**, and \`loam validate --feature\` reports
|
|
18
|
+
it as such. \`loam archive\` runs the same coherence check first and refuses a feature
|
|
19
|
+
with GATING issues — every error, plus the rare warning marked \`gates: true\` because
|
|
20
|
+
the merge would silently drop authored content even though the document is legal.
|
|
21
|
+
Advisory warnings never block: archive prints them and proceeds. Each one still names
|
|
22
|
+
something real — usually something the merge will drop or overwrite — so read them
|
|
23
|
+
before the merge runs, not after.
|
|
24
|
+
|
|
25
|
+
\`--approve\` overrides the gating issues — only those, and archive prints exactly which
|
|
26
|
+
ones it overrode. It is a human decision, not an agent's: if archive refuses, fix the
|
|
27
|
+
breach or hand it back. Two refusals sit outside its reach, because the damage is
|
|
28
|
+
mechanical rather than a judgment about the feature: \`delta.service-id-invalid\` — a
|
|
29
|
+
\`specs/<svc>/\` directory whose name is not a legal service id, which the merge
|
|
30
|
+
would materialise as a \`services/<svc>/\` every loam command then refuses to
|
|
31
|
+
address — and \`c4.service-binding-invalid\` — an explicit \`metadata { service }\`
|
|
32
|
+
binding that breaks the same grammar, on a tagged element or anything nested
|
|
33
|
+
inside its block (the merge splices the whole authored block into the living
|
|
34
|
+
landscape verbatim, untagged children included, and a \`../\` in the binding even
|
|
35
|
+
collapses the archive's \`services/\` probe out of the docs repo). There is
|
|
36
|
+
nothing a judgment call could accept: rename the directory, or fix the binding,
|
|
37
|
+
instead.
|
|
38
|
+
|
|
39
|
+
Breaches only the merge computation itself can see are reported at plan time,
|
|
40
|
+
after the gate. \`living.requirement-outside-requirements\` (error): the LIVING spec
|
|
41
|
+
holds a requirement outside \`## Requirements\`, and the merge rewrites only that
|
|
42
|
+
section, so the requirement would land in the file twice — \`--approve\` does not
|
|
43
|
+
override it, because the duplication is mechanical, not a judgment call; re-home the
|
|
44
|
+
requirement first. \`openapi.op-modified\` (warn): the feature redefines an operation
|
|
45
|
+
the living OpenAPI already has, and the merge overwrites the living definition
|
|
46
|
+
wholesale.
|
|
47
|
+
|
|
48
|
+
The OpenAPI merge also carries a \`$ref\` closure rooted in what it actually WROTE
|
|
49
|
+
— the merged operations and the components this delta declares alike: every
|
|
50
|
+
\`#/components/<kind>/<name>\` they reference, recursively with a component's own
|
|
51
|
+
refs included, is copied from the feature document into the living one, so nothing
|
|
52
|
+
lands pointing at a schema that stayed behind. A delta whose whole change is a
|
|
53
|
+
shared schema, with no \`paths\` at all, is merged the same way and by the same
|
|
54
|
+
rules. \`openapi.component-modified\` (warn): a carried component overwrites a
|
|
55
|
+
living one that differs, wholesale, same discipline as an operation.
|
|
56
|
+
\`openapi.ref-unresolved\` (error, \`--approve\` overrides): a ref reachable from the
|
|
57
|
+
merged operations or a merged component resolves in neither document, so merging
|
|
58
|
+
would write a dangling reference. External refs — URLs, file paths, anything not
|
|
59
|
+
starting \`#/\` — are out of scope: left untouched, never gated.
|
|
60
|
+
|
|
61
|
+
## Taking an archive back
|
|
62
|
+
|
|
63
|
+
\`loam unarchive <FEAT>\` restores the living docs and re-opens the feature. It works
|
|
64
|
+
by putting bytes back, not by inverting the merge — archive copies every file it is
|
|
65
|
+
about to overwrite into \`features/archive/<FEAT>/.loam-before/\` first, because the
|
|
66
|
+
previous text of a \`MODIFIED\` requirement is written down nowhere else. Do not edit
|
|
67
|
+
or delete that directory, and never reconstruct an old living spec by hand from an
|
|
68
|
+
archived delta: what the requirement said BEFORE is not in there, and a plausible
|
|
69
|
+
reconstruction is a lie the next reader has no way to catch.
|
|
70
|
+
|
|
71
|
+
Every pre-image is digested when the archive writes it, and re-checked before the
|
|
72
|
+
restore stages anything: \`snapshot-corrupt\` means a pre-image's bytes no longer
|
|
73
|
+
match the digest archive recorded for them, so restoring it would write text
|
|
74
|
+
nobody authored. \`--force\` does NOT override that one — the damage is to the
|
|
75
|
+
undo itself, not to the living docs — and the fix is version control.
|
|
76
|
+
|
|
77
|
+
It refuses rather than guesses, under codes you can branch on: \`feature-active\` (a
|
|
78
|
+
feature of that id is in flight again), \`snapshot-missing\` (archived before loam
|
|
79
|
+
recorded this — the docs have to come back from version control), \`snapshot-stale\`
|
|
80
|
+
(a merged file changed after the archive, so restoring would revert someone else's
|
|
81
|
+
work). \`--force\` overrides the last one, and like \`--approve\` it is a human's call.
|
|
82
|
+
|
|
83
|
+
A restore that fails outright splits the same way archive's does: \`restore-failed\`
|
|
84
|
+
means nothing was restored or everything was rolled back — the living docs are
|
|
85
|
+
unchanged, fix the reported cause and re-run; \`rollback-incomplete\` means the
|
|
86
|
+
restore failed AND some files could not be put back — stop and hand it to a human,
|
|
87
|
+
the message lists the files to check.
|
|
88
|
+
|
|
89
|
+
## Dropping a feature
|
|
90
|
+
|
|
91
|
+
A feature that was never archived is one directory and nothing else: no living doc
|
|
92
|
+
references it until \`loam archive\` merges it. To abandon it, delete the directory —
|
|
93
|
+
\`git rm -r features/<FEAT-dir>\` — and version control keeps the record of the
|
|
94
|
+
attempt. An ARCHIVED feature is the opposite, its content folded into the living
|
|
95
|
+
docs: run \`loam unarchive <FEAT>\` first, then delete. There is no \`loam abandon\`,
|
|
96
|
+
deliberately — a removal that computes nothing is what version control is for.
|
|
97
|
+
`;
|
|
98
|
+
//# sourceMappingURL=archive-gate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"archive-gate.js","sourceRoot":"","sources":["../../../../../src/core/agent/agents-md/shipped/archive-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkF3B,CAAC","sourcesContent":["/**\n * How a SHIPPED change is gated, undone or dropped: the archive gate,\n * unarchive, and dropping a feature. The continuation of ../refusals.ts —\n * that module holds what loam refuses and the error-envelope codes; this one\n * holds what happens to a feature once the merge is on the table. Split\n * there because the two subjects were one 300-plus-line file, and the file's\n * own header already named them separately.\n *\n * One section of the AGENTS.md template. ../../agents-md.ts assembles the\n * document by PLAIN CONCATENATION — no join separator — so this section\n * starts at the first character of its opening heading and ends with the\n * newline that closes its last line. Keep that shape when editing, or two\n * sections glue onto one line in every docs repo loam scaffolds from now on.\n */\nexport const ARCHIVE_GATE = `## The archive gate\n\nThe three axes agreeing is called **coherence**, and \\`loam validate --feature\\` reports\nit as such. \\`loam archive\\` runs the same coherence check first and refuses a feature\nwith GATING issues — every error, plus the rare warning marked \\`gates: true\\` because\nthe merge would silently drop authored content even though the document is legal.\nAdvisory warnings never block: archive prints them and proceeds. Each one still names\nsomething real — usually something the merge will drop or overwrite — so read them\nbefore the merge runs, not after.\n\n\\`--approve\\` overrides the gating issues — only those, and archive prints exactly which\nones it overrode. It is a human decision, not an agent's: if archive refuses, fix the\nbreach or hand it back. Two refusals sit outside its reach, because the damage is\nmechanical rather than a judgment about the feature: \\`delta.service-id-invalid\\` — a\n\\`specs/<svc>/\\` directory whose name is not a legal service id, which the merge\nwould materialise as a \\`services/<svc>/\\` every loam command then refuses to\naddress — and \\`c4.service-binding-invalid\\` — an explicit \\`metadata { service }\\`\nbinding that breaks the same grammar, on a tagged element or anything nested\ninside its block (the merge splices the whole authored block into the living\nlandscape verbatim, untagged children included, and a \\`../\\` in the binding even\ncollapses the archive's \\`services/\\` probe out of the docs repo). There is\nnothing a judgment call could accept: rename the directory, or fix the binding,\ninstead.\n\nBreaches only the merge computation itself can see are reported at plan time,\nafter the gate. \\`living.requirement-outside-requirements\\` (error): the LIVING spec\nholds a requirement outside \\`## Requirements\\`, and the merge rewrites only that\nsection, so the requirement would land in the file twice — \\`--approve\\` does not\noverride it, because the duplication is mechanical, not a judgment call; re-home the\nrequirement first. \\`openapi.op-modified\\` (warn): the feature redefines an operation\nthe living OpenAPI already has, and the merge overwrites the living definition\nwholesale.\n\nThe OpenAPI merge also carries a \\`$ref\\` closure rooted in what it actually WROTE\n— the merged operations and the components this delta declares alike: every\n\\`#/components/<kind>/<name>\\` they reference, recursively with a component's own\nrefs included, is copied from the feature document into the living one, so nothing\nlands pointing at a schema that stayed behind. A delta whose whole change is a\nshared schema, with no \\`paths\\` at all, is merged the same way and by the same\nrules. \\`openapi.component-modified\\` (warn): a carried component overwrites a\nliving one that differs, wholesale, same discipline as an operation.\n\\`openapi.ref-unresolved\\` (error, \\`--approve\\` overrides): a ref reachable from the\nmerged operations or a merged component resolves in neither document, so merging\nwould write a dangling reference. External refs — URLs, file paths, anything not\nstarting \\`#/\\` — are out of scope: left untouched, never gated.\n\n## Taking an archive back\n\n\\`loam unarchive <FEAT>\\` restores the living docs and re-opens the feature. It works\nby putting bytes back, not by inverting the merge — archive copies every file it is\nabout to overwrite into \\`features/archive/<FEAT>/.loam-before/\\` first, because the\nprevious text of a \\`MODIFIED\\` requirement is written down nowhere else. Do not edit\nor delete that directory, and never reconstruct an old living spec by hand from an\narchived delta: what the requirement said BEFORE is not in there, and a plausible\nreconstruction is a lie the next reader has no way to catch.\n\nEvery pre-image is digested when the archive writes it, and re-checked before the\nrestore stages anything: \\`snapshot-corrupt\\` means a pre-image's bytes no longer\nmatch the digest archive recorded for them, so restoring it would write text\nnobody authored. \\`--force\\` does NOT override that one — the damage is to the\nundo itself, not to the living docs — and the fix is version control.\n\nIt refuses rather than guesses, under codes you can branch on: \\`feature-active\\` (a\nfeature of that id is in flight again), \\`snapshot-missing\\` (archived before loam\nrecorded this — the docs have to come back from version control), \\`snapshot-stale\\`\n(a merged file changed after the archive, so restoring would revert someone else's\nwork). \\`--force\\` overrides the last one, and like \\`--approve\\` it is a human's call.\n\nA restore that fails outright splits the same way archive's does: \\`restore-failed\\`\nmeans nothing was restored or everything was rolled back — the living docs are\nunchanged, fix the reported cause and re-run; \\`rollback-incomplete\\` means the\nrestore failed AND some files could not be put back — stop and hand it to a human,\nthe message lists the files to check.\n\n## Dropping a feature\n\nA feature that was never archived is one directory and nothing else: no living doc\nreferences it until \\`loam archive\\` merges it. To abandon it, delete the directory —\n\\`git rm -r features/<FEAT-dir>\\` — and version control keeps the record of the\nattempt. An ARCHIVED feature is the opposite, its content folded into the living\ndocs: run \\`loam unarchive <FEAT>\\` first, then delete. There is no \\`loam abandon\\`,\ndeliberately — a removal that computes nothing is what version control is for.\n`;\n"]}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which element in the C4 model IS which service — the binding rule, and the
|
|
3
|
+
* two-way completeness check `loam validate --all` runs over `services/`.
|
|
4
|
+
*
|
|
5
|
+
* This module used to carry the whole ID spine: every join between the
|
|
6
|
+
* artifacts, the `Based-On:` baseline pins, how to draw a shared broker, and
|
|
7
|
+
* how to declare a message produced outside the fleet. Those are now the
|
|
8
|
+
* `loam-spine` reference page (../workflows/reference/spine.ts), printed by
|
|
9
|
+
* `loam instructions loam-spine` — grammars a reader consults while writing one
|
|
10
|
+
* document, in a file that was being truncated by two hosts before it reached
|
|
11
|
+
* them (./command-map.ts's header has the measurement).
|
|
12
|
+
*
|
|
13
|
+
* THIS section stayed, and the line between it and the page it lost is worth
|
|
14
|
+
* saying: an agent cannot read the landscape at all without knowing that a box's
|
|
15
|
+
* title is its service id unless `metadata { service }` says otherwise. It is
|
|
16
|
+
* orientation, not reference — it is needed to form the question, not to answer
|
|
17
|
+
* it.
|
|
18
|
+
*
|
|
19
|
+
* One section of the AGENTS.md template. ../agents-md.ts assembles the
|
|
20
|
+
* document by PLAIN CONCATENATION — no join separator — so every section
|
|
21
|
+
* starts at the first character of its opening line and ends with the newline
|
|
22
|
+
* that closes its last one. Keep that shape when editing, or two sections glue
|
|
23
|
+
* onto one line in every docs repo loam scaffolds from now on.
|
|
24
|
+
*/
|
|
25
|
+
export const SPINE = `## Which element IS which service
|
|
26
|
+
|
|
27
|
+
An element says which service it is with \`metadata { service 'payment-service' }\`.
|
|
28
|
+
Without one, its **title** is used instead — which is what most of this repo relies
|
|
29
|
+
on, and also the trap: rename a box in a diagram and every check joining it to
|
|
30
|
+
\`services/<svc>/\` silently stops matching. Bind an element whenever its title is
|
|
31
|
+
not exactly the directory name, and prefer binding over renaming a directory.
|
|
32
|
+
|
|
33
|
+
\`services/\` is the list of services — there is no manifest, and none should be
|
|
34
|
+
added. \`loam validate --all\` compares that list to the landscape both ways: a
|
|
35
|
+
directory nothing draws is an error, and an element with no directory is a warning.
|
|
36
|
+
Systems that are not ours — kafka, a payment gateway — carry \`#external\`, which
|
|
37
|
+
says so once and stops the warning for good.
|
|
38
|
+
|
|
39
|
+
`;
|
|
40
|
+
//# sourceMappingURL=spine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spine.js","sourceRoot":"","sources":["../../../../src/core/agent/agents-md/spine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG;;;;;;;;;;;;;;CAcpB,CAAC","sourcesContent":["/**\n * Which element in the C4 model IS which service — the binding rule, and the\n * two-way completeness check `loam validate --all` runs over `services/`.\n *\n * This module used to carry the whole ID spine: every join between the\n * artifacts, the `Based-On:` baseline pins, how to draw a shared broker, and\n * how to declare a message produced outside the fleet. Those are now the\n * `loam-spine` reference page (../workflows/reference/spine.ts), printed by\n * `loam instructions loam-spine` — grammars a reader consults while writing one\n * document, in a file that was being truncated by two hosts before it reached\n * them (./command-map.ts's header has the measurement).\n *\n * THIS section stayed, and the line between it and the page it lost is worth\n * saying: an agent cannot read the landscape at all without knowing that a box's\n * title is its service id unless `metadata { service }` says otherwise. It is\n * orientation, not reference — it is needed to form the question, not to answer\n * it.\n *\n * One section of the AGENTS.md template. ../agents-md.ts assembles the\n * document by PLAIN CONCATENATION — no join separator — so every section\n * starts at the first character of its opening line and ends with the newline\n * that closes its last one. Keep that shape when editing, or two sections glue\n * onto one line in every docs repo loam scaffolds from now on.\n */\nexport const SPINE = `## Which element IS which service\n\nAn element says which service it is with \\`metadata { service 'payment-service' }\\`.\nWithout one, its **title** is used instead — which is what most of this repo relies\non, and also the trap: rename a box in a diagram and every check joining it to\n\\`services/<svc>/\\` silently stops matching. Bind an element whenever its title is\nnot exactly the directory name, and prefer binding over renaming a directory.\n\n\\`services/\\` is the list of services — there is no manifest, and none should be\nadded. \\`loam validate --all\\` compares that list to the landscape both ways: a\ndirectory nothing draws is an error, and an element with no directory is a warning.\nSystems that are not ours — kafka, a payment gateway — carry \\`#external\\`, which\nsays so once and stops the warning for good.\n\n`;\n"]}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The small, always-loaded orientation contract for a loam docs repository.
|
|
3
|
+
*
|
|
4
|
+
* Detailed grammars and workflows live behind `loam instructions`: those pages
|
|
5
|
+
* describe the binary that is about to run, while this file is written once and
|
|
6
|
+
* may be loaded into every agent turn for years. Keep only enough here to form
|
|
7
|
+
* the next question, find the relevant page, and avoid an unsafe write.
|
|
8
|
+
*/
|
|
9
|
+
import { agentsStampLine } from "./agents-stamp.js";
|
|
10
|
+
import { LOAM_VERSION } from "../envelope/version.js";
|
|
11
|
+
const ORIENTATION = `# Working in this docs repo
|
|
12
|
+
|
|
13
|
+
This is a **loam** docs repo: plain files are the shared source of truth for a governed software
|
|
14
|
+
fleet's architecture, requirements, contracts and verification evidence. A service may be a modular monolith, a network service, a CLI or a worker.
|
|
15
|
+
loam has no server or database. Delete it and the documents still make sense.
|
|
16
|
+
|
|
17
|
+
## What is where
|
|
18
|
+
|
|
19
|
+
\`architecture/landscape.likec4\` is the fleet map, and
|
|
20
|
+
\`architecture/adrs/\` optional system-level decisions — only their links are graded.
|
|
21
|
+
\`services/<id>/\` holds a boundary's living \`model.likec4\`, \`spec.md\`,
|
|
22
|
+
\`arch.spec.md\`, OpenAPI, AsyncAPI, runbook and health facts.
|
|
23
|
+
\`features/<FEAT>/\` holds a change in flight: \`intent.md\`, \`delta.likec4\`,
|
|
24
|
+
per-service requirement and contract deltas, and \`verification.yaml\`.
|
|
25
|
+
\`features/archive/\` is shipped history.
|
|
26
|
+
|
|
27
|
+
Living documents are the complete current state. A feature document is a diff
|
|
28
|
+
against them, reviewed as a diff; \`loam archive\` folds it into living state.
|
|
29
|
+
Do not hand-edit the living landscape to add a feature change.
|
|
30
|
+
|
|
31
|
+
## Linking between documents
|
|
32
|
+
|
|
33
|
+
Documents join with **standard markdown links** whose targets are real relative
|
|
34
|
+
paths, for example \`[decision](../adrs/ADR-001.md)\`. They render in pull-request
|
|
35
|
+
review instead of showing literal brackets,
|
|
36
|
+
and make “does this link resolve” a filesystem question; \`[[Wikilinks]]\` would
|
|
37
|
+
require shortest-unique-path guessing.
|
|
38
|
+
Obsidian supports markdown links, autocomplete and rename-tracking when its
|
|
39
|
+
wikilink setting is off. \`link.unresolved\` grades missing targets and CASE
|
|
40
|
+
**is** graded; links outside this repository, \`#section\` targets, a fenced code
|
|
41
|
+
block or an inline code span are deliberately not graded.
|
|
42
|
+
|
|
43
|
+
## \`loam.json\` — the wiring
|
|
44
|
+
|
|
45
|
+
Every repository commits its own \`loam.json\`:
|
|
46
|
+
|
|
47
|
+
\`{ "docsDir": "../docs", "service": "payment-service", "gherkinDir": "features" }\`
|
|
48
|
+
|
|
49
|
+
\`docsDir\` is stored exactly as it was passed and resolved against the directory
|
|
50
|
+
holding the \`loam.json\`, so a relative path survives a clone; an absolute one
|
|
51
|
+
raises \`doctor.docs-absolute\`. \`service\` binds a service checkout to the one boundary
|
|
52
|
+
it may write evidence for. \`gherkinDir\` is optional. \`agentTools\` and
|
|
53
|
+
\`agentProfile\` record which agent surfaces and workflow subset init manages;
|
|
54
|
+
\`agentFiles\` records digests so unchanged generated pointers can refresh while
|
|
55
|
+
customized ones remain untouched. With no config, loam refuses with \`no-config\`
|
|
56
|
+
rather than guessing.
|
|
57
|
+
|
|
58
|
+
\`loam init --docs <dir>\` **joins** an existing docs repo. Add \`--create\` only
|
|
59
|
+
when creating a new one; a typo must not scaffold a second source of truth.
|
|
60
|
+
|
|
61
|
+
## Starting from chat
|
|
62
|
+
|
|
63
|
+
There are two equivalent entry points into the same version-matched protocol.
|
|
64
|
+
Prefer the explicit one when a user wants a predictable lifecycle: invoke
|
|
65
|
+
\`/loam-feature <FEAT> "<title>"\` to propose, \`/loam-implement <FEAT> [service]\`
|
|
66
|
+
to build, \`/loam-check\` and \`/loam-verify <FEAT>\` to grade it, and
|
|
67
|
+
\`/loam-ship <FEAT>\` to finish. Most hosts use that flat slash
|
|
68
|
+
spelling; Gemini uses \`/loam:feature\`, Amazon Q uses \`@loam-feature\`, and a
|
|
69
|
+
skills-only host can invoke \`$loam-feature\`. Natural-language requests may load
|
|
70
|
+
the matching Agent Skill instead. Once either entry point is selected, the agent
|
|
71
|
+
drives the internal status/edit/validate loop and asks the user only for a real
|
|
72
|
+
decision or human-only act; the user does not have to type every loam command.
|
|
73
|
+
|
|
74
|
+
If loam or an agent integration behaves unexpectedly, invoke \`/loam-report\` (or
|
|
75
|
+
load \`$loam-report\` on a skills-only host). It collects a sanitized, reproducible
|
|
76
|
+
Markdown report under \`loam-reports/\` without repairing the repository, retrying a
|
|
77
|
+
writer or uploading anything. This is support, not a seventh lifecycle step.
|
|
78
|
+
|
|
79
|
+
## The cycle
|
|
80
|
+
|
|
81
|
+
0. **Wire the repo** — in each service checkout run
|
|
82
|
+
\`loam init --docs <path-to-docs-repo> --service <id>\`, then \`loam doctor\`.
|
|
83
|
+
1. **Adopt** — for an undocumented boundary load \`loam instructions loam-adopt
|
|
84
|
+
<id>\`, then use \`loam adopt --service <id> --json\`. Write drafts; a person,
|
|
85
|
+
never an agent, later vouches for them.
|
|
86
|
+
2. **Understand** — start or resume with \`loam status --json\`; its ordered
|
|
87
|
+
\`next[]\` is the work queue. Read \`next[0].execution\`: run it only when
|
|
88
|
+
\`runnable\` is true; otherwise use \`kind\`, \`cwd\`, \`needs\` and \`after\`
|
|
89
|
+
to complete the edit or external-repo step. Use \`loam list --json\`, \`loam show <id> --json\`
|
|
90
|
+
and \`loam explore <id> --json\` before proposing a change. Never propose a
|
|
91
|
+
change to a service you have not read.
|
|
92
|
+
3. **Scaffold** — load \`loam instructions loam-feature <FEAT>\`, then run
|
|
93
|
+
\`loam new <FEAT> --title "..." --touches <service>\`.
|
|
94
|
+
4. **Author** — fill the scaffolded TODOs and run \`loam rebase <FEAT>\` after
|
|
95
|
+
reading the living baselines. The exact joins and authoring grammars are in
|
|
96
|
+
the reference pages below.
|
|
97
|
+
5. **Check** — load \`loam instructions loam-check --no-fix-tables\`, run
|
|
98
|
+
\`loam validate <FEAT> --json\`, and use \`loam explain <code>\` for reported
|
|
99
|
+
codes. \`loam dependencies --json\` names features that must archive first.
|
|
100
|
+
6. **Build** — load \`loam instructions loam-implement <FEAT>\`.
|
|
101
|
+
\`loam delta <FEAT> --service <id> --json\` is one service's task; in that
|
|
102
|
+
service checkout, \`loam gherkin <FEAT>\` emits its executable scenarios.
|
|
103
|
+
7. **Verify** — \`loam verify <FEAT> --json\` is the checklist. Record evidence
|
|
104
|
+
from each affected service's own checkout. Read
|
|
105
|
+
\`loam instructions loam-done-check\` before recording anything.
|
|
106
|
+
8. **Ship** — load \`loam instructions loam-ship <FEAT>\`; begin with
|
|
107
|
+
\`loam archive <FEAT> --dry-run --json\`, then archive only after the code is
|
|
108
|
+
merged and the plan is the one reviewed.
|
|
109
|
+
|
|
110
|
+
## Reading loam's output
|
|
111
|
+
|
|
112
|
+
Every command takes \`--json\`. The envelope has \`contractVersion\`, \`ok\` and,
|
|
113
|
+
on refusal, \`error.code\`. Unknown flags are \`invalid-option\`; \`--help\` and
|
|
114
|
+
\`--version\` pass through. Branch on stable codes, never message prose.
|
|
115
|
+
|
|
116
|
+
Validation \`findings[]\` carry \`severity\`; archive-related findings also carry
|
|
117
|
+
\`gates\`. Severity and gating are two different questions: errors invalidate,
|
|
118
|
+
while \`gates: true\` makes archive refuse — archive is gated on coherence, so a
|
|
119
|
+
gating finding stops it whatever its severity. Advisory warnings never block.
|
|
120
|
+
\`--approve\` overrides the gating issues — only those that are judgement calls —
|
|
121
|
+
and never a mechanical loss. For example \`delta.requirement-not-merged\` warns but gates;
|
|
122
|
+
\`living.requirement-outside-requirements\` cannot be approved, while
|
|
123
|
+
\`openapi.op-modified\` is reviewable.
|
|
124
|
+
|
|
125
|
+
\`loam status --json\` orders executable next actions. Findings include structured
|
|
126
|
+
\`locations[]\`; use their paths instead of extracting filenames from prose.
|
|
127
|
+
\`loam show <FEAT> --json\` includes a \`review\` pack with intent, architecture,
|
|
128
|
+
contracts, dependencies, verification, blockers and the same next actions.
|
|
129
|
+
\`loam explain <code> --json\`
|
|
130
|
+
returns one code's meaning and fix; \`loam explain --codes --json\` lists them.
|
|
131
|
+
Which codes an INVOCATION can raise is in \`loam instructions loam-codes\`.
|
|
132
|
+
|
|
133
|
+
## The identity rule
|
|
134
|
+
|
|
135
|
+
A service is the element whose \`metadata { service '<id>' }\` matches its
|
|
136
|
+
\`services/<id>/\` directory. An exact element id is the legacy fallback. Never
|
|
137
|
+
infer identity from display names or containment. Relationships join to contracts
|
|
138
|
+
through exact ids: OpenAPI \`operationId\`, requirement \`Operations:\`, and C4
|
|
139
|
+
\`metadata { op '...' }\`. Consult \`loam instructions loam-spine\` before editing
|
|
140
|
+
a join.
|
|
141
|
+
|
|
142
|
+
## Reference pages — fetch when needed
|
|
143
|
+
|
|
144
|
+
- \`loam instructions loam-codes\` — finding/refusal inventory and fixes.
|
|
145
|
+
- \`loam instructions loam-spine\` — operation, message, coverage, permission,
|
|
146
|
+
capability and baseline joins.
|
|
147
|
+
- \`loam instructions loam-authoring\` — arch requirements, generated Gherkin
|
|
148
|
+
and frontmatter/vouch grammar.
|
|
149
|
+
- \`loam instructions loam-done-check\` — verification evidence and verdicts.
|
|
150
|
+
|
|
151
|
+
Bare \`loam instructions\` lists the six workflows, the separate \`loam-report\`
|
|
152
|
+
support protocol and these references. Generated agent command/skill files are
|
|
153
|
+
small pointers to them, so the runtime page wins if an old pointer disagrees with
|
|
154
|
+
the installed binary. MCP clients can read the same pages as
|
|
155
|
+
\`loam://orientation\` and \`loam://instructions/<name>\` resources.
|
|
156
|
+
|
|
157
|
+
## Safety and hand-back
|
|
158
|
+
|
|
159
|
+
loam's writers are journaled, but the lifecycle still matters. Do not run
|
|
160
|
+
\`loam vouch\` for a human, do not invent evidence, do not archive before code is
|
|
161
|
+
merged, and do not edit generated files under \`<gherkinDir>/loam/\` by hand.
|
|
162
|
+
\`loam unarchive <FEAT>\` is the supported undo. To abandon a feature that was
|
|
163
|
+
never archived, review it and use \`git rm -r features/<FEAT>\`; loam deliberately
|
|
164
|
+
has no destructive drop command.
|
|
165
|
+
|
|
166
|
+
Finish by reporting remaining warnings, unverifiable claims, files or directories
|
|
167
|
+
you did not inspect, and the exact human action still owed.
|
|
168
|
+
`;
|
|
169
|
+
export const AGENTS_MD = `${agentsStampLine(LOAM_VERSION)}\n${ORIENTATION}`;
|
|
170
|
+
//# sourceMappingURL=agents-md.js.map
|