@ybotok/loam 0.2.0-alpha.6 → 0.2.0-alpha.9
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 +1477 -1
- package/COMPARISON.md +91 -3
- package/CONTRIBUTING.md +37 -0
- package/MIGRATING-from-OpenSpec.md +40 -22
- package/QUICKSTART.md +181 -9
- package/README.md +256 -57
- package/ROADMAP.md +108 -11
- package/SCHEMA.md +721 -130
- package/WORKFLOW.md +272 -62
- package/dist/cli.js +26 -8
- package/dist/cli.js.map +1 -1
- package/dist/commands/adopt/adopt.js +5 -10
- package/dist/commands/adopt/adopt.js.map +1 -1
- package/dist/commands/archive/archive.js +15 -18
- package/dist/commands/archive/archive.js.map +1 -1
- package/dist/commands/archive/plan/contracts/asyncapi.js +27 -41
- package/dist/commands/archive/plan/contracts/asyncapi.js.map +1 -1
- package/dist/commands/archive/plan/contracts/consumers.js +56 -0
- package/dist/commands/archive/plan/contracts/consumers.js.map +1 -0
- package/dist/commands/archive/plan/contracts/openapi.js +25 -42
- package/dist/commands/archive/plan/contracts/openapi.js.map +1 -1
- package/dist/commands/archive/plan/contracts/verdict-lines.js +41 -0
- package/dist/commands/archive/plan/contracts/verdict-lines.js.map +1 -0
- package/dist/commands/archive/plan/gate.js +3 -7
- package/dist/commands/archive/plan/gate.js.map +1 -1
- package/dist/commands/archive/plan/landscape.js +4 -4
- package/dist/commands/archive/plan/landscape.js.map +1 -1
- package/dist/commands/archive/plan/refusal.js +8 -18
- package/dist/commands/archive/plan/refusal.js.map +1 -1
- package/dist/commands/archive/plan/specs.js +134 -25
- package/dist/commands/archive/plan/specs.js.map +1 -1
- package/dist/commands/archive/plan/state.js +1 -0
- package/dist/commands/archive/plan/state.js.map +1 -1
- package/dist/commands/archive/run.js +82 -33
- package/dist/commands/archive/run.js.map +1 -1
- package/dist/commands/archive/shipped.js +49 -0
- package/dist/commands/archive/shipped.js.map +1 -0
- package/dist/commands/context/context.js +4 -7
- package/dist/commands/context/context.js.map +1 -1
- package/dist/commands/context/print.js +2 -2
- package/dist/commands/context/print.js.map +1 -1
- package/dist/commands/delta/delta.js +44 -12
- package/dist/commands/delta/delta.js.map +1 -1
- package/dist/commands/delta/print.js +1 -1
- package/dist/commands/delta/print.js.map +1 -1
- package/dist/commands/dependencies.js +3 -7
- package/dist/commands/dependencies.js.map +1 -1
- package/dist/commands/diff/diff.js +20 -27
- package/dist/commands/diff/diff.js.map +1 -1
- package/dist/commands/explore.js +4 -8
- package/dist/commands/explore.js.map +1 -1
- package/dist/commands/gate/gate.js +45 -8
- package/dist/commands/gate/gate.js.map +1 -1
- package/dist/commands/gate/print.js +15 -3
- package/dist/commands/gate/print.js.map +1 -1
- package/dist/commands/gherkin/commit.js +13 -54
- package/dist/commands/gherkin/commit.js.map +1 -1
- package/dist/commands/gherkin/gherkin.js +36 -20
- package/dist/commands/gherkin/gherkin.js.map +1 -1
- package/dist/commands/gherkin/reconcile.js +10 -13
- package/dist/commands/gherkin/reconcile.js.map +1 -1
- package/dist/commands/init/first-hour.js +44 -0
- package/dist/commands/init/first-hour.js.map +1 -1
- package/dist/commands/init/init.js +18 -22
- package/dist/commands/init/init.js.map +1 -1
- package/dist/commands/list/campaign/campaign.js +4 -6
- package/dist/commands/list/campaign/campaign.js.map +1 -1
- package/dist/commands/list/json.js +0 -4
- package/dist/commands/list/json.js.map +1 -1
- package/dist/commands/list/list.js +38 -23
- package/dist/commands/list/list.js.map +1 -1
- package/dist/commands/list/print.js +38 -6
- package/dist/commands/list/print.js.map +1 -1
- package/dist/commands/list/suites/suites.js +140 -0
- package/dist/commands/list/suites/suites.js.map +1 -0
- package/dist/commands/list/views.js +28 -33
- package/dist/commands/list/views.js.map +1 -1
- package/dist/commands/mcp/dispatch.js +91 -36
- package/dist/commands/mcp/dispatch.js.map +1 -1
- package/dist/commands/mcp/mcp.js +56 -15
- package/dist/commands/mcp/mcp.js.map +1 -1
- package/dist/commands/mcp/serve.js.map +1 -1
- package/dist/commands/migrate-openspec/materialize/active.js +27 -22
- package/dist/commands/migrate-openspec/materialize/active.js.map +1 -1
- package/dist/commands/migrate-openspec/materialize/stage.js +4 -3
- package/dist/commands/migrate-openspec/materialize/stage.js.map +1 -1
- package/dist/commands/migrate-openspec/materialize/target.js +2 -2
- package/dist/commands/migrate-openspec/materialize/target.js.map +1 -1
- package/dist/commands/migrate-openspec/openspec/decisions.js +9 -14
- package/dist/commands/migrate-openspec/openspec/decisions.js.map +1 -1
- package/dist/commands/migrate-openspec/openspec/error.js +7 -8
- package/dist/commands/migrate-openspec/openspec/error.js.map +1 -1
- package/dist/commands/migrate-openspec/openspec/mapping.js +1 -9
- package/dist/commands/migrate-openspec/openspec/mapping.js.map +1 -1
- package/dist/commands/migrate-openspec/openspec/paths.js +3 -6
- package/dist/commands/migrate-openspec/openspec/paths.js.map +1 -1
- package/dist/commands/new/capability-template.js +118 -0
- package/dist/commands/new/capability-template.js.map +1 -0
- package/dist/commands/new/commit.js +8 -22
- package/dist/commands/new/commit.js.map +1 -1
- package/dist/commands/new/modifies.js +206 -0
- package/dist/commands/new/modifies.js.map +1 -0
- package/dist/commands/new/new.js +59 -14
- package/dist/commands/new/new.js.map +1 -1
- package/dist/commands/new/templates.js +48 -124
- package/dist/commands/new/templates.js.map +1 -1
- package/dist/commands/open.js +3 -7
- package/dist/commands/open.js.map +1 -1
- package/dist/commands/policy/gate.js +27 -0
- package/dist/commands/policy/gate.js.map +1 -1
- package/dist/commands/rebase/plan.js +2 -2
- package/dist/commands/rebase/plan.js.map +1 -1
- package/dist/commands/rebase/rebase.js +60 -35
- package/dist/commands/rebase/rebase.js.map +1 -1
- package/dist/commands/seed/commit.js +55 -26
- package/dist/commands/seed/commit.js.map +1 -1
- package/dist/commands/seed/plan.js +64 -13
- package/dist/commands/seed/plan.js.map +1 -1
- package/dist/commands/seed/seed.js +6 -9
- package/dist/commands/seed/seed.js.map +1 -1
- package/dist/commands/show/show.js +3 -7
- package/dist/commands/show/show.js.map +1 -1
- package/dist/commands/status/print.js +13 -4
- package/dist/commands/status/print.js.map +1 -1
- package/dist/commands/status/status.js +3 -7
- package/dist/commands/status/status.js.map +1 -1
- package/dist/commands/steps/steps.js +3 -7
- package/dist/commands/steps/steps.js.map +1 -1
- package/dist/commands/subsystem/edit.js +7 -7
- package/dist/commands/subsystem/edit.js.map +1 -1
- package/dist/commands/subsystem/move.js +60 -25
- package/dist/commands/subsystem/move.js.map +1 -1
- package/dist/commands/subsystem/query.js +2 -4
- package/dist/commands/subsystem/query.js.map +1 -1
- package/dist/commands/subsystem/subsystem.js +4 -7
- package/dist/commands/subsystem/subsystem.js.map +1 -1
- package/dist/commands/subsystem/sync.js +141 -71
- package/dist/commands/subsystem/sync.js.map +1 -1
- package/dist/commands/subsystem/txn/report.js +55 -5
- package/dist/commands/subsystem/txn/report.js.map +1 -1
- package/dist/commands/subsystem/txn/txn.js +121 -45
- package/dist/commands/subsystem/txn/txn.js.map +1 -1
- package/dist/commands/subsystem/txn/views.js +82 -12
- package/dist/commands/subsystem/txn/views.js.map +1 -1
- package/dist/commands/tasks/render.js +116 -0
- package/dist/commands/tasks/render.js.map +1 -0
- package/dist/commands/tasks/tasks.js +113 -0
- package/dist/commands/tasks/tasks.js.map +1 -0
- package/dist/commands/unarchive/manifest.js +6 -9
- package/dist/commands/unarchive/manifest.js.map +1 -1
- package/dist/commands/unarchive/restore.js +17 -28
- package/dist/commands/unarchive/restore.js.map +1 -1
- package/dist/commands/unarchive/unarchive.js +22 -30
- package/dist/commands/unarchive/unarchive.js.map +1 -1
- package/dist/commands/validate/arch-coverage.js +6 -15
- package/dist/commands/validate/arch-coverage.js.map +1 -1
- package/dist/commands/validate/checks/fleet-shape.js +4 -49
- package/dist/commands/validate/checks/fleet-shape.js.map +1 -1
- package/dist/commands/validate/checks/health-deps.js +9 -6
- package/dist/commands/validate/checks/health-deps.js.map +1 -1
- package/dist/commands/validate/checks/requirements.js +18 -8
- package/dist/commands/validate/checks/requirements.js.map +1 -1
- package/dist/commands/validate/checks/sources.js +6 -2
- package/dist/commands/validate/checks/sources.js.map +1 -1
- package/dist/commands/validate/feature.js +23 -19
- package/dist/commands/validate/feature.js.map +1 -1
- package/dist/commands/validate/fleet/census.js +26 -3
- package/dist/commands/validate/fleet/census.js.map +1 -1
- package/dist/commands/validate/fleet/landscape.js +35 -32
- package/dist/commands/validate/fleet/landscape.js.map +1 -1
- package/dist/commands/validate/fleet/map/attest.js +7 -12
- package/dist/commands/validate/fleet/map/attest.js.map +1 -1
- package/dist/commands/validate/fleet/map/bindings.js +16 -5
- package/dist/commands/validate/fleet/map/bindings.js.map +1 -1
- package/dist/commands/validate/fleet/map/consumers.js +43 -122
- package/dist/commands/validate/fleet/map/consumers.js.map +1 -1
- package/dist/commands/validate/fleet/map/usecases.js +5 -11
- package/dist/commands/validate/fleet/map/usecases.js.map +1 -1
- package/dist/commands/validate/fleet/obligations.js +1 -5
- package/dist/commands/validate/fleet/obligations.js.map +1 -1
- package/dist/commands/validate/fleet/scorecard/print.js +5 -1
- package/dist/commands/validate/fleet/scorecard/print.js.map +1 -1
- package/dist/commands/validate/fleet/scorecard/scorecard.js +17 -11
- package/dist/commands/validate/fleet/scorecard/scorecard.js.map +1 -1
- package/dist/commands/validate/fleet/usecases/usecases.js +6 -4
- package/dist/commands/validate/fleet/usecases/usecases.js.map +1 -1
- package/dist/commands/validate/fleet/views/fleet-project.js +1 -1
- package/dist/commands/validate/fleet/views/fleet-project.js.map +1 -1
- package/dist/commands/validate/fleet/views/ids.js +33 -7
- package/dist/commands/validate/fleet/views/ids.js.map +1 -1
- package/dist/commands/validate/fleet/views/root-documents.js +17 -35
- package/dist/commands/validate/fleet/views/root-documents.js.map +1 -1
- package/dist/commands/validate/fleet/views/stale.js +31 -14
- package/dist/commands/validate/fleet/views/stale.js.map +1 -1
- package/dist/commands/validate/links/corpus.js +1 -4
- package/dist/commands/validate/links/corpus.js.map +1 -1
- package/dist/commands/validate/links/glossary.js.map +1 -1
- package/dist/commands/validate/report.js +5 -4
- package/dist/commands/validate/report.js.map +1 -1
- package/dist/commands/validate/scope.js +113 -0
- package/dist/commands/validate/scope.js.map +1 -0
- package/dist/commands/validate/service/api.js +16 -104
- package/dist/commands/validate/service/api.js.map +1 -1
- package/dist/commands/validate/service/contracts/generated.js +134 -0
- package/dist/commands/validate/service/contracts/generated.js.map +1 -0
- package/dist/commands/validate/service/events/events.js +1 -1
- package/dist/commands/validate/service/events/events.js.map +1 -1
- package/dist/commands/validate/service/events/message-producers.js +1 -1
- package/dist/commands/validate/service/events/message-producers.js.map +1 -1
- package/dist/commands/validate/service/evidence-pins.js +56 -10
- package/dist/commands/validate/service/evidence-pins.js.map +1 -1
- package/dist/commands/validate/service/service.js +16 -26
- package/dist/commands/validate/service/service.js.map +1 -1
- package/dist/commands/validate/service/specs.js +31 -38
- package/dist/commands/validate/service/specs.js.map +1 -1
- package/dist/commands/validate/service/spine.js +8 -11
- package/dist/commands/validate/service/spine.js.map +1 -1
- package/dist/commands/validate/service/usecases/usecases.js +3 -3
- package/dist/commands/validate/service/usecases/usecases.js.map +1 -1
- package/dist/commands/validate/validate.js +44 -26
- package/dist/commands/validate/validate.js.map +1 -1
- package/dist/commands/verify/cross/diff.js +2 -6
- package/dist/commands/verify/cross/diff.js.map +1 -1
- package/dist/commands/verify/evidence/contract.js +1 -1
- package/dist/commands/verify/evidence/contract.js.map +1 -1
- package/dist/commands/verify/evidence/read.js +12 -3
- package/dist/commands/verify/evidence/read.js.map +1 -1
- package/dist/commands/verify/frozen.js +45 -23
- package/dist/commands/verify/frozen.js.map +1 -1
- package/dist/commands/verify/record.js +69 -17
- package/dist/commands/verify/record.js.map +1 -1
- package/dist/commands/verify/report.js +27 -44
- package/dist/commands/verify/report.js.map +1 -1
- package/dist/commands/verify/results.js +112 -30
- package/dist/commands/verify/results.js.map +1 -1
- package/dist/commands/verify/verify.js +54 -51
- package/dist/commands/verify/verify.js.map +1 -1
- package/dist/commands/vouch/pack/pack.js +2 -2
- package/dist/commands/vouch/pack/pack.js.map +1 -1
- package/dist/commands/vouch/pack/print.js +1 -6
- package/dist/commands/vouch/pack/print.js.map +1 -1
- package/dist/commands/vouch/pack/sections.js +1 -2
- package/dist/commands/vouch/pack/sections.js.map +1 -1
- package/dist/commands/vouch/run.js +26 -81
- package/dist/commands/vouch/run.js.map +1 -1
- package/dist/commands/vouch/sample/plan.js +20 -34
- package/dist/commands/vouch/sample/plan.js.map +1 -1
- package/dist/commands/vouch/vet/verify.js +39 -7
- package/dist/commands/vouch/vet/verify.js.map +1 -1
- package/dist/commands/vouch/vouch.js +10 -17
- package/dist/commands/vouch/vouch.js.map +1 -1
- package/dist/core/agent/agents-md/command-map.js +57 -102
- package/dist/core/agent/agents-md/command-map.js.map +1 -1
- package/dist/core/agent/agents-md/map/explain.js +4 -3
- package/dist/core/agent/agents-md/map/explain.js.map +1 -1
- package/dist/core/agent/agents-md/map/lenses/context.js +4 -3
- package/dist/core/agent/agents-md/map/lenses/context.js.map +1 -1
- package/dist/core/agent/agents-md/map/lenses/diff.js +33 -20
- package/dist/core/agent/agents-md/map/lenses/diff.js.map +1 -1
- package/dist/core/agent/agents-md/map/lenses/gate.js +13 -5
- package/dist/core/agent/agents-md/map/lenses/gate.js.map +1 -1
- package/dist/core/agent/agents-md/map/mcp.js +10 -7
- package/dist/core/agent/agents-md/map/mcp.js.map +1 -1
- package/dist/core/agent/agents-md/map/status.js +9 -3
- package/dist/core/agent/agents-md/map/status.js.map +1 -1
- package/dist/core/agent/agents-md/map/subsystem.js +31 -17
- package/dist/core/agent/agents-md/map/subsystem.js.map +1 -1
- package/dist/core/agent/agents-md/map/usecases.js +24 -6
- package/dist/core/agent/agents-md/map/usecases.js.map +1 -1
- package/dist/core/agent/agents-md/refusals.js +37 -21
- package/dist/core/agent/agents-md/refusals.js.map +1 -1
- package/dist/core/agent/agents-md.js +25 -10
- package/dist/core/agent/agents-md.js.map +1 -1
- package/dist/core/agent/agents-stamp.js +10 -0
- package/dist/core/agent/agents-stamp.js.map +1 -1
- package/dist/core/agent/scaffold.js +10 -15
- package/dist/core/agent/scaffold.js.map +1 -1
- package/dist/core/agent/tools/dialects.js +1 -0
- package/dist/core/agent/tools/dialects.js.map +1 -1
- package/dist/core/agent/tools/registry.js +41 -76
- package/dist/core/agent/tools/registry.js.map +1 -1
- package/dist/core/agent/workflows/adopt.js +5 -3
- package/dist/core/agent/workflows/adopt.js.map +1 -1
- package/dist/core/agent/workflows/check.js +25 -22
- package/dist/core/agent/workflows/check.js.map +1 -1
- package/dist/core/agent/workflows/closing.js +54 -21
- package/dist/core/agent/workflows/closing.js.map +1 -1
- package/dist/core/agent/workflows/feature.js +79 -11
- package/dist/core/agent/workflows/feature.js.map +1 -1
- package/dist/core/agent/workflows/implement.js +91 -13
- package/dist/core/agent/workflows/implement.js.map +1 -1
- package/dist/core/agent/workflows/reference/authoring.js +3 -1
- package/dist/core/agent/workflows/reference/authoring.js.map +1 -1
- package/dist/core/agent/workflows/reference/codes.js +8 -6
- package/dist/core/agent/workflows/reference/codes.js.map +1 -1
- package/dist/core/agent/workflows/reference/done-check.js +37 -15
- package/dist/core/agent/workflows/reference/done-check.js.map +1 -1
- package/dist/core/agent/workflows/reference/reference.js.map +1 -1
- package/dist/core/agent/workflows/reference/spine.js +62 -24
- package/dist/core/agent/workflows/reference/spine.js.map +1 -1
- package/dist/core/asyncapi/baseline/plan.js +14 -81
- package/dist/core/asyncapi/baseline/plan.js.map +1 -1
- package/dist/core/asyncapi/digest.js +30 -25
- package/dist/core/asyncapi/digest.js.map +1 -1
- package/dist/core/asyncapi/merge/components.js +5 -4
- package/dist/core/asyncapi/merge/components.js.map +1 -1
- package/dist/core/asyncapi/merge/error.js +7 -2
- package/dist/core/asyncapi/merge/error.js.map +1 -1
- package/dist/core/asyncapi/merge/markers.js +30 -50
- package/dist/core/asyncapi/merge/markers.js.map +1 -1
- package/dist/core/asyncapi/merge/merge.js +31 -53
- package/dist/core/asyncapi/merge/merge.js.map +1 -1
- package/dist/core/asyncapi/merge/pin.js +10 -36
- package/dist/core/asyncapi/merge/pin.js.map +1 -1
- package/dist/core/asyncapi/model.js.map +1 -1
- package/dist/core/asyncapi/read.js +36 -12
- package/dist/core/asyncapi/read.js.map +1 -1
- package/dist/core/brief/brief.js +30 -25
- package/dist/core/brief/brief.js.map +1 -1
- package/dist/core/brief/landscape.js +8 -12
- package/dist/core/brief/landscape.js.map +1 -1
- package/dist/core/brief/map/extend.js +8 -5
- package/dist/core/brief/map/extend.js.map +1 -1
- package/dist/core/brief/map/owed.js +8 -26
- package/dist/core/brief/map/owed.js.map +1 -1
- package/dist/core/brief/targets.js +79 -5
- package/dist/core/brief/targets.js.map +1 -1
- package/dist/core/brief/unchecked.js +1 -1
- package/dist/core/brief/unchecked.js.map +1 -1
- package/dist/core/c4/likec4.js +147 -16
- package/dist/core/c4/likec4.js.map +1 -1
- package/dist/core/c4/locate/unlocated.js +150 -0
- package/dist/core/c4/locate/unlocated.js.map +1 -0
- package/dist/core/c4/parsed/values.js +54 -1
- package/dist/core/c4/parsed/values.js.map +1 -1
- package/dist/core/c4/prefetch/fleet.js +1 -9
- package/dist/core/c4/prefetch/fleet.js.map +1 -1
- package/dist/core/c4/project/architecture.js +31 -9
- package/dist/core/c4/project/architecture.js.map +1 -1
- package/dist/core/c4/project/documents.js +36 -10
- package/dist/core/c4/project/documents.js.map +1 -1
- package/dist/core/c4/project/load.js +14 -21
- package/dist/core/c4/project/load.js.map +1 -1
- package/dist/core/c4/project/staged.js +7 -3
- package/dist/core/c4/project/staged.js.map +1 -1
- package/dist/core/c4/resolve/external.js +51 -0
- package/dist/core/c4/resolve/external.js.map +1 -0
- package/dist/core/c4/resolve/service.js +25 -1
- package/dist/core/c4/resolve/service.js.map +1 -1
- package/dist/core/c4/seed/template.js +15 -1
- package/dist/core/c4/seed/template.js.map +1 -1
- package/dist/core/c4/service-model/shape.js +2 -22
- package/dist/core/c4/service-model/shape.js.map +1 -1
- package/dist/core/c4/source-mask.js +288 -4
- package/dist/core/c4/source-mask.js.map +1 -1
- package/dist/core/c4/source-scan.js +203 -147
- package/dist/core/c4/source-scan.js.map +1 -1
- package/dist/core/c4/splice/authored-source.js +19 -0
- package/dist/core/c4/splice/authored-source.js.map +1 -1
- package/dist/core/c4/splice/delta-blocks.js +5 -18
- package/dist/core/c4/splice/delta-blocks.js.map +1 -1
- package/dist/core/c4/splice/landscape-merge.js +13 -8
- package/dist/core/c4/splice/landscape-merge.js.map +1 -1
- package/dist/core/c4/splice/model/merge.js +10 -6
- package/dist/core/c4/splice/model/merge.js.map +1 -1
- package/dist/core/c4/splice/placement.js +108 -18
- package/dist/core/c4/splice/placement.js.map +1 -1
- package/dist/core/c4/workspace.js +13 -22
- package/dist/core/c4/workspace.js.map +1 -1
- package/dist/core/capabilities/capabilities.js +6 -6
- package/dist/core/capabilities/capabilities.js.map +1 -1
- package/dist/core/capabilities/delta/doc.js +7 -10
- package/dist/core/capabilities/delta/doc.js.map +1 -1
- package/dist/core/capabilities/findings.js +15 -20
- package/dist/core/capabilities/findings.js.map +1 -1
- package/dist/core/capabilities/realizes/findings.js +12 -19
- package/dist/core/capabilities/realizes/findings.js.map +1 -1
- package/dist/core/capabilities/realizes/join.js +0 -20
- package/dist/core/capabilities/realizes/join.js.map +1 -1
- package/dist/core/capabilities/rollup.js +6 -0
- package/dist/core/capabilities/rollup.js.map +1 -1
- package/dist/core/capabilities/tree.js +6 -28
- package/dist/core/capabilities/tree.js.map +1 -1
- package/dist/core/capabilities/usecase-join.js +3 -13
- package/dist/core/capabilities/usecase-join.js.map +1 -1
- package/dist/core/coherence/authoring/scaffold.js +11 -3
- package/dist/core/coherence/authoring/scaffold.js.map +1 -1
- package/dist/core/coherence/authoring/sentinels.js +2 -1
- package/dist/core/coherence/authoring/sentinels.js.map +1 -1
- package/dist/core/coherence/coherence.js +30 -16
- package/dist/core/coherence/coherence.js.map +1 -1
- package/dist/core/coherence/consumed/operations.js +70 -0
- package/dist/core/coherence/consumed/operations.js.map +1 -0
- package/dist/core/coherence/consumed/refusal.js +38 -0
- package/dist/core/coherence/consumed/refusal.js.map +1 -0
- package/dist/core/coherence/declared.js +60 -34
- package/dist/core/coherence/declared.js.map +1 -1
- package/dist/core/coherence/events/declared.js +44 -59
- package/dist/core/coherence/events/declared.js.map +1 -1
- package/dist/core/coherence/events/events.js +119 -8
- package/dist/core/coherence/events/events.js.map +1 -1
- package/dist/core/coherence/events/grades.js +31 -8
- package/dist/core/coherence/events/grades.js.map +1 -1
- package/dist/core/coherence/events/lookups.js +14 -82
- package/dist/core/coherence/events/lookups.js.map +1 -1
- package/dist/core/coherence/lookups.js +18 -78
- package/dist/core/coherence/lookups.js.map +1 -1
- package/dist/core/coherence/retired/archived.js +285 -0
- package/dist/core/coherence/retired/archived.js.map +1 -0
- package/dist/core/coherence/retired/event-pair.js +62 -0
- package/dist/core/coherence/retired/event-pair.js.map +1 -0
- package/dist/core/coherence/retired/merged.js +79 -0
- package/dist/core/coherence/retired/merged.js.map +1 -0
- package/dist/core/coherence/retired/retirement.js +49 -0
- package/dist/core/coherence/retired/retirement.js.map +1 -0
- package/dist/core/coherence/retired/revival/arrivals.js +131 -0
- package/dist/core/coherence/retired/revival/arrivals.js.map +1 -0
- package/dist/core/coherence/retired/revival/revived.js +297 -0
- package/dist/core/coherence/retired/revival/revived.js.map +1 -0
- package/dist/core/consumers/after.js +113 -0
- package/dist/core/consumers/after.js.map +1 -0
- package/dist/core/consumers/consumers.js +296 -0
- package/dist/core/consumers/consumers.js.map +1 -0
- package/dist/core/consumers/current.js +211 -0
- package/dist/core/consumers/current.js.map +1 -0
- package/dist/core/consumers/scan.js +46 -0
- package/dist/core/consumers/scan.js.map +1 -0
- package/dist/core/consumers/state.js +27 -0
- package/dist/core/consumers/state.js.map +1 -0
- package/dist/core/delta/delta.js +1 -1
- package/dist/core/delta/delta.js.map +1 -1
- package/dist/core/deployment/delta.js +15 -16
- package/dist/core/deployment/delta.js.map +1 -1
- package/dist/core/diff/base-git.js +94 -12
- package/dist/core/diff/base-git.js.map +1 -1
- package/dist/core/diff/base-state.js +28 -16
- package/dist/core/diff/base-state.js.map +1 -1
- package/dist/core/diff/joins.js +136 -0
- package/dist/core/diff/joins.js.map +1 -0
- package/dist/core/diff/scope/changed-paths.js +22 -6
- package/dist/core/diff/scope/changed-paths.js.map +1 -1
- package/dist/core/diff/scope/edges.js +82 -0
- package/dist/core/diff/scope/edges.js.map +1 -0
- package/dist/core/diff/semantic.js +100 -31
- package/dist/core/diff/semantic.js.map +1 -1
- package/dist/core/doctor/agents.js +34 -18
- package/dist/core/doctor/agents.js.map +1 -1
- package/dist/core/doctor/report.js.map +1 -1
- package/dist/core/document/apply.js +10 -2
- package/dist/core/document/apply.js.map +1 -1
- package/dist/core/document/frontmatter.js +55 -0
- package/dist/core/document/frontmatter.js.map +1 -1
- package/dist/core/document/parse.js +29 -6
- package/dist/core/document/parse.js.map +1 -1
- package/dist/core/document/scenarios.js +17 -0
- package/dist/core/document/scenarios.js.map +1 -1
- package/dist/core/document/spec.js +4 -11
- package/dist/core/document/spec.js.map +1 -1
- package/dist/core/envelope/config.js +10 -0
- package/dist/core/envelope/config.js.map +1 -1
- package/dist/core/envelope/json.js +34 -0
- package/dist/core/envelope/json.js.map +1 -1
- package/dist/core/explain/families.js +17 -12
- package/dist/core/explain/families.js.map +1 -1
- package/dist/core/explain/refusals.js +3 -3
- package/dist/core/explain/refusals.js.map +1 -1
- package/dist/core/explain/terms.js +18 -9
- package/dist/core/explain/terms.js.map +1 -1
- package/dist/core/explore/explore.js +2 -7
- package/dist/core/explore/explore.js.map +1 -1
- package/dist/core/fleet-context.js +34 -95
- package/dist/core/fleet-context.js.map +1 -1
- package/dist/core/gate/checks.js +10 -3
- package/dist/core/gate/checks.js.map +1 -1
- package/dist/core/gate/partners.js +64 -19
- package/dist/core/gate/partners.js.map +1 -1
- package/dist/core/gate/report.js.map +1 -1
- package/dist/core/gate/verification.js +75 -12
- package/dist/core/gate/verification.js.map +1 -1
- package/dist/core/gherkin/stale.js +13 -37
- package/dist/core/gherkin/stale.js.map +1 -1
- package/dist/core/glossary/tree.js +6 -19
- package/dist/core/glossary/tree.js.map +1 -1
- package/dist/core/kernel/concurrency.js +19 -0
- package/dist/core/kernel/concurrency.js.map +1 -1
- package/dist/core/kernel/records.js +11 -0
- package/dist/core/kernel/records.js.map +1 -1
- package/dist/core/links/backlinks.js +1 -3
- package/dist/core/links/backlinks.js.map +1 -1
- package/dist/core/links/corpus.js +5 -36
- package/dist/core/links/corpus.js.map +1 -1
- package/dist/core/mcp/argv.js +101 -0
- package/dist/core/mcp/argv.js.map +1 -1
- package/dist/core/mcp/author-tools.js +2 -1
- package/dist/core/mcp/author-tools.js.map +1 -1
- package/dist/core/mcp/protocol.js +2 -2
- package/dist/core/mcp/protocol.js.map +1 -1
- package/dist/core/mcp/tools.js +43 -33
- package/dist/core/mcp/tools.js.map +1 -1
- package/dist/core/openapi/baseline/gate.js +53 -12
- package/dist/core/openapi/baseline/gate.js.map +1 -1
- package/dist/core/openapi/baseline/plan.js +22 -8
- package/dist/core/openapi/baseline/plan.js.map +1 -1
- package/dist/core/openapi/baseline/record.js +0 -1
- package/dist/core/openapi/baseline/record.js.map +1 -1
- package/dist/core/openapi/contract-text.js +33 -0
- package/dist/core/openapi/contract-text.js.map +1 -0
- package/dist/core/openapi/contract-tree.js +56 -0
- package/dist/core/openapi/contract-tree.js.map +1 -0
- package/dist/core/openapi/depth.js +38 -24
- package/dist/core/openapi/depth.js.map +1 -1
- package/dist/core/openapi/digest.js +52 -2
- package/dist/core/openapi/digest.js.map +1 -1
- package/dist/core/openapi/doc.js +12 -4
- package/dist/core/openapi/doc.js.map +1 -1
- package/dist/core/openapi/merge/components.js +25 -60
- package/dist/core/openapi/merge/components.js.map +1 -1
- package/dist/core/openapi/merge/error.js +3 -13
- package/dist/core/openapi/merge/error.js.map +1 -1
- package/dist/core/openapi/merge/markers.js +26 -30
- package/dist/core/openapi/merge/markers.js.map +1 -1
- package/dist/core/openapi/merge/merge.js +26 -52
- package/dist/core/openapi/merge/merge.js.map +1 -1
- package/dist/core/openapi/merge/pin.js +15 -35
- package/dist/core/openapi/merge/pin.js.map +1 -1
- package/dist/core/openspec/decide/verdict.js.map +1 -1
- package/dist/core/openspec/inventory.js +4 -5
- package/dist/core/openspec/inventory.js.map +1 -1
- package/dist/core/openspec/model/mapping.js +30 -28
- package/dist/core/openspec/model/mapping.js.map +1 -1
- package/dist/core/openspec/model/model.js +12 -7
- package/dist/core/openspec/model/model.js.map +1 -1
- package/dist/core/openspec/scan/changes.js +10 -4
- package/dist/core/openspec/scan/changes.js.map +1 -1
- package/dist/core/openspec/scan/config.js +7 -16
- package/dist/core/openspec/scan/config.js.map +1 -1
- package/dist/core/openspec/scan/shape.js +63 -19
- package/dist/core/openspec/scan/shape.js.map +1 -1
- package/dist/core/openspec/scan/walk.js +21 -38
- package/dist/core/openspec/scan/walk.js.map +1 -1
- package/dist/core/pack/living.js +2 -16
- package/dist/core/pack/living.js.map +1 -1
- package/dist/core/provenance/findings.js +48 -12
- package/dist/core/provenance/findings.js.map +1 -1
- package/dist/core/provenance/git.js +33 -57
- package/dist/core/provenance/git.js.map +1 -1
- package/dist/core/provenance/gitq/moves.js +71 -114
- package/dist/core/provenance/gitq/moves.js.map +1 -1
- package/dist/core/provenance/gitq/vouched-ancestor.js +2 -2
- package/dist/core/provenance/gitq/vouched-ancestor.js.map +1 -1
- package/dist/core/provenance/sources.js +23 -6
- package/dist/core/provenance/sources.js.map +1 -1
- package/dist/core/provenance/stamp.js +5 -17
- package/dist/core/provenance/stamp.js.map +1 -1
- package/dist/core/repo/entries.js.map +1 -1
- package/dist/core/repo/paths.js +34 -29
- package/dist/core/repo/paths.js.map +1 -1
- package/dist/core/repo/repo.js +24 -14
- package/dist/core/repo/repo.js.map +1 -1
- package/dist/core/repo/tree/find.js +12 -3
- package/dist/core/repo/tree/find.js.map +1 -1
- package/dist/core/repo/tree/fs.js +27 -1
- package/dist/core/repo/tree/fs.js.map +1 -1
- package/dist/core/repo/tree/render/body.js +45 -6
- package/dist/core/repo/tree/render/body.js.map +1 -1
- package/dist/core/repo/tree/render/service/header.js +125 -0
- package/dist/core/repo/tree/render/service/header.js.map +1 -0
- package/dist/core/repo/tree/render/service/peers.js +28 -0
- package/dist/core/repo/tree/render/service/peers.js.map +1 -0
- package/dist/core/repo/tree/render/service/view-id.js +67 -0
- package/dist/core/repo/tree/render/service/view-id.js.map +1 -0
- package/dist/core/repo/tree/render/service/views.js +78 -0
- package/dist/core/repo/tree/render/service/views.js.map +1 -0
- package/dist/core/repo/tree/render/stale.js +19 -2
- package/dist/core/repo/tree/render/stale.js.map +1 -1
- package/dist/core/repo/tree/render/views.js +102 -33
- package/dist/core/repo/tree/render/views.js.map +1 -1
- package/dist/core/repo/tree/walk.js +8 -30
- package/dist/core/repo/tree/walk.js.map +1 -1
- package/dist/core/results.js +47 -12
- package/dist/core/results.js.map +1 -1
- package/dist/core/staging/commit.js +10 -12
- package/dist/core/staging/commit.js.map +1 -1
- package/dist/core/staging/lock.js +74 -12
- package/dist/core/staging/lock.js.map +1 -1
- package/dist/core/staging/recovery/intent.js +2 -5
- package/dist/core/staging/recovery/intent.js.map +1 -1
- package/dist/core/staging/recovery/recover.js +60 -1
- package/dist/core/staging/recovery/recover.js.map +1 -1
- package/dist/core/staging/snapshot/manifest.js +152 -0
- package/dist/core/staging/snapshot/manifest.js.map +1 -0
- package/dist/core/staging/{snapshot.js → snapshot/snapshot.js} +10 -34
- package/dist/core/staging/snapshot/snapshot.js.map +1 -0
- package/dist/core/status/actions/execution.js +11 -0
- package/dist/core/status/actions/execution.js.map +1 -1
- package/dist/core/status/feature/artifacts.js +2 -2
- package/dist/core/status/feature/artifacts.js.map +1 -1
- package/dist/core/status/feature/feature.js +5 -11
- package/dist/core/status/feature/feature.js.map +1 -1
- package/dist/core/status/fleet/fleet.js +6 -2
- package/dist/core/status/fleet/fleet.js.map +1 -1
- package/dist/core/status/fleet/next.js +26 -3
- package/dist/core/status/fleet/next.js.map +1 -1
- package/dist/core/status/report.js.map +1 -1
- package/dist/core/status/verification.js +30 -15
- package/dist/core/status/verification.js.map +1 -1
- package/dist/core/tasks/packet.js +174 -0
- package/dist/core/tasks/packet.js.map +1 -0
- package/dist/core/tasks/record.js +43 -0
- package/dist/core/tasks/record.js.map +1 -0
- package/dist/core/tasks/sources.js +181 -0
- package/dist/core/tasks/sources.js.map +1 -0
- package/dist/core/tasks/stamps.js +76 -0
- package/dist/core/tasks/stamps.js.map +1 -0
- package/dist/core/tasks/unit.js +0 -0
- package/dist/core/tasks/unit.js.map +1 -0
- package/dist/core/usecases/capability.js +11 -14
- package/dist/core/usecases/capability.js.map +1 -1
- package/dist/core/usecases/delta/flows.js +5 -7
- package/dist/core/usecases/delta/flows.js.map +1 -1
- package/dist/core/usecases/fleet.js +178 -31
- package/dist/core/usecases/fleet.js.map +1 -1
- package/dist/core/usecases/operations.js +5 -4
- package/dist/core/usecases/operations.js.map +1 -1
- package/dist/core/usecases/service/flows.js +9 -6
- package/dist/core/usecases/service/flows.js.map +1 -1
- package/dist/core/usecases/suites/participants.js +83 -0
- package/dist/core/usecases/suites/participants.js.map +1 -0
- package/dist/core/usecases/suites/suites.js +45 -0
- package/dist/core/usecases/suites/suites.js.map +1 -0
- package/dist/core/verify/answers.js +12 -5
- package/dist/core/verify/answers.js.map +1 -1
- package/dist/core/verify/build.js +102 -82
- package/dist/core/verify/build.js.map +1 -1
- package/dist/core/verify/checklist.js +45 -10
- package/dist/core/verify/checklist.js.map +1 -1
- package/dist/core/verify/location.js +67 -0
- package/dist/core/verify/location.js.map +1 -0
- package/dist/core/verify/pins/lint.js +3 -2
- package/dist/core/verify/pins/lint.js.map +1 -1
- package/dist/core/verify/pins/pin.js +1 -1
- package/dist/core/verify/pins/pin.js.map +1 -1
- package/dist/core/verify/read/file.js +224 -0
- package/dist/core/verify/read/file.js.map +1 -0
- package/dist/core/verify/{file.js → read/shape.js} +16 -104
- package/dist/core/verify/read/shape.js.map +1 -0
- package/dist/core/verify/read/union.js +105 -0
- package/dist/core/verify/read/union.js.map +1 -0
- package/dist/core/verify/record.js +35 -12
- package/dist/core/verify/record.js.map +1 -1
- package/dist/core/verify/store/commit.js +40 -30
- package/dist/core/verify/store/commit.js.map +1 -1
- package/dist/core/verify/store/render.js +8 -4
- package/dist/core/verify/store/render.js.map +1 -1
- package/dist/core/vocabulary/issue.js +1 -0
- package/dist/core/vocabulary/issue.js.map +1 -1
- package/dist/core/vocabulary/maturity.js +53 -3
- package/dist/core/vocabulary/maturity.js.map +1 -1
- package/examples/README.md +28 -9
- package/examples/docs/architecture/landscape.likec4 +21 -7
- package/examples/docs/architecture/services.likec4 +70 -0
- package/examples/docs/architecture/subsystems.likec4 +3 -0
- package/examples/docs/architecture/usecases/order-notification.likec4 +6 -2
- package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-service/asyncapi.yaml +11 -8
- package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-split-service/openapi.yaml +6 -6
- package/examples/docs/features/archive/FEAT-088-refunds/specs/payment-service/openapi.yaml +13 -10
- package/examples/docs/services/order-service/asyncapi.yaml +3 -2
- package/examples/docs/services/order-service/model.likec4 +10 -8
- package/examples/docs/services/payment-service/model.likec4 +6 -4
- package/examples/docs/services/platform/identity-service/model.likec4 +9 -7
- package/examples/docs/services/platform/notification-service/asyncapi.yaml +2 -1
- package/examples/docs/services/platform/notification-service/model.likec4 +4 -5
- package/package.json +1 -1
- package/dist/commands/validate/checks/vocabulary.js +0 -16
- package/dist/commands/validate/checks/vocabulary.js.map +0 -1
- package/dist/core/agent/agents-md/artifacts.js +0 -221
- package/dist/core/agent/agents-md/artifacts.js.map +0 -1
- package/dist/core/agent/agents-md/cycle.js +0 -180
- package/dist/core/agent/agents-md/cycle.js.map +0 -1
- package/dist/core/agent/agents-md/shipped/archive-gate.js +0 -98
- package/dist/core/agent/agents-md/shipped/archive-gate.js.map +0 -1
- package/dist/core/agent/agents-md/spine.js +0 -40
- package/dist/core/agent/agents-md/spine.js.map +0 -1
- package/dist/core/coherence/events/merged.js +0 -40
- package/dist/core/coherence/events/merged.js.map +0 -1
- package/dist/core/diff/current-state.js +0 -96
- package/dist/core/diff/current-state.js.map +0 -1
- package/dist/core/diff/victims.js +0 -256
- package/dist/core/diff/victims.js.map +0 -1
- package/dist/core/staging/snapshot.js.map +0 -1
- package/dist/core/verify/file.js.map +0 -1
package/COMPARISON.md
CHANGED
|
@@ -4,7 +4,8 @@ loam is not a replacement for an architecture renderer, a software catalog, a co
|
|
|
4
4
|
broker, an API-diff engine, or a code-level architecture test. It is the layer that keeps an
|
|
5
5
|
authored C4 model, requirements, contracts and verification evidence semantically connected while
|
|
6
6
|
the system changes. Most of the tools below can sit beside it; the useful question is which part of
|
|
7
|
-
the problem each one should own.
|
|
7
|
+
the problem each one should own. One section is different in kind and carries a date: the
|
|
8
|
+
spec-driven change tools overlap loam's own job, and they change every week.
|
|
8
9
|
|
|
9
10
|
## Architecture as code: LikeC4 and Structurizr
|
|
10
11
|
|
|
@@ -48,8 +49,11 @@ replace consumer-driven contract tests.
|
|
|
48
49
|
detection](https://buf.build/docs/breaking/overview/) inspect contract revisions in much greater
|
|
49
50
|
depth than loam. They answer whether an OpenAPI or Protobuf change is structurally breaking; loam
|
|
50
51
|
answers which authored consumers and requirements are joined to the operation or message being
|
|
51
|
-
changed
|
|
52
|
-
|
|
52
|
+
changed — `loam diff` names them for a removal, a deprecation, and a modification of the operation
|
|
53
|
+
or anything its `$ref`s reach — and never whether the change breaks them. Authored means drawn or
|
|
54
|
+
written in the docs repo: a caller the map does not draw is invisible to it, and one drawn without
|
|
55
|
+
an operation on its edge is reported as a consumer nobody could check. Use the specialist diff in
|
|
56
|
+
CI beside loam rather than expecting either tool to infer the other half.
|
|
53
57
|
|
|
54
58
|
## Requirements traceability: OpenFastTrace, Doorstop, StrictDoc and Sphinx-Needs
|
|
55
59
|
|
|
@@ -71,6 +75,90 @@ question loam intentionally does not: whether the code actually has the structur
|
|
|
71
75
|
claims. Use them to turn selected architecture rules into executable code checks; use loam to keep
|
|
72
76
|
the authored system model and the rest of its semantic record coherent.
|
|
73
77
|
|
|
78
|
+
## Spec-driven change tools, as of October 2026
|
|
79
|
+
|
|
80
|
+
These are the tools a team evaluating loam usually holds it against, and unlike the neighbours
|
|
81
|
+
above they overlap its job: each turns an intended change into specs an agent implements. They
|
|
82
|
+
release about weekly, so this section is dated — checked 2026-10-09 against each project's
|
|
83
|
+
releases, documentation and issue tracker — and each claim links its source. It records what each
|
|
84
|
+
offers for a change that crosses repositories or services, what is still open upstream, and where
|
|
85
|
+
loam differs. It does not rank them.
|
|
86
|
+
|
|
87
|
+
**OpenSpec** (1.14.1, published 2026-10-05)
|
|
88
|
+
|
|
89
|
+
- [Stores](https://openspec.dev/docs/stores), in beta since 1.5.0, keep specs in a repository of
|
|
90
|
+
their own that several code repositories plan against; worksets, also beta, group them. The guide
|
|
91
|
+
says OpenSpec does not route tasks to repositories: for a change spanning components, its pattern
|
|
92
|
+
is a shared contract in the store plus a separate local change in each component repository,
|
|
93
|
+
linked by hand. Since 1.14.0, a store-backed apply may also edit the code repository that
|
|
94
|
+
declares the store.
|
|
95
|
+
- `openspec show <change> --diff` (1.11.0) renders each requirement of a change as a unified diff
|
|
96
|
+
against its base, with `--json --diff` for pipelines
|
|
97
|
+
([releases](https://github.com/Fission-AI/OpenSpec/releases)).
|
|
98
|
+
- The [Cloud Agent](https://openspec.dev/blog/openspec-cloud-agents), in early access since
|
|
99
|
+
2026-08-28 with new sign-ups paused on 2026-09-11, is hosted. It checks pull requests against
|
|
100
|
+
spec requirements, shows requirements across repositories as in sync, drifted or needing a
|
|
101
|
+
decision, scans daily and opens corrective pull requests. The page does not say how it detects
|
|
102
|
+
drift.
|
|
103
|
+
- Open: [#725](https://github.com/Fission-AI/OpenSpec/issues/725), multi-repository and
|
|
104
|
+
microservice spec management, open since 2026-02-18. On 2026-09-07 the maintainers' bot confirmed
|
|
105
|
+
that shared changes with repository slices and explicit apply targets do not exist yet.
|
|
106
|
+
|
|
107
|
+
**Spec Kit** (1.1.2, 2026-10-07)
|
|
108
|
+
|
|
109
|
+
- The [contract-driven development
|
|
110
|
+
guide](https://github.github.com/spec-kit/guides/contract-driven-development.html) (September
|
|
111
|
+
2026) covers interfaces between repositories or components by convention: the owner publishes a
|
|
112
|
+
versioned contract, consumers pin it, and provider and consumer contract tests go into the tasks.
|
|
113
|
+
It excludes contract sync, cross-repository dependency resolution and release orchestration, and
|
|
114
|
+
describes no automated check between consumer and provider.
|
|
115
|
+
- [`/speckit.converge`](https://raw.githubusercontent.com/github/spec-kit/main/templates/commands/converge.md)
|
|
116
|
+
(June 2026) runs after implementation: the agent compares the code with one feature's spec, plan
|
|
117
|
+
and tasks, classes each gap as missing, partial, contradicting or unrequested, and appends tasks
|
|
118
|
+
for them.
|
|
119
|
+
- 1.1.1 added an experimental MCP server, and 1.1.2 MCP tools that list a project's artifacts
|
|
120
|
+
([releases](https://github.com/github/spec-kit/releases)).
|
|
121
|
+
- Open: [#4583](https://github.com/github/spec-kit/issues/4583), multi-repository microservices,
|
|
122
|
+
open since 2026-09-14 and labelled triage-can-wait. The maintainer linked the contract-driven
|
|
123
|
+
guide and asked whether it is enough to close it.
|
|
124
|
+
|
|
125
|
+
**Kiro** (IDE 1.2, CLI 2.28)
|
|
126
|
+
|
|
127
|
+
- [Feature specs](https://kiro.dev/docs/specs/) are Requirements-First or, since IDE 0.10
|
|
128
|
+
(February 2026), Design-First — requirements derived from an existing architecture or sketch —
|
|
129
|
+
and live per feature under `.kiro/specs`. Analyze Requirements (0.12, May 2026) checks a
|
|
130
|
+
requirements document for ambiguity, conflicts and gaps before design.
|
|
131
|
+
- [Kiro Web](https://kiro.dev/changelog/web/introducing-kiro-web-preview/) (preview from
|
|
132
|
+
2026-05-18) clones several repositories into one cloud session, coordinates a change across them
|
|
133
|
+
and opens a pull or merge request in each repository it changed; since June, GitHub and GitLab
|
|
134
|
+
repositories can share a session.
|
|
135
|
+
- For specs that span repositories, the [best-practices
|
|
136
|
+
page](https://kiro.dev/docs/specs/best-practices/) suggests a central specs repository linked by
|
|
137
|
+
submodules, packages or symlinks. The docs describe no merge of a finished spec into a living
|
|
138
|
+
baseline and no drift detection; [#9435](https://github.com/kirodotdev/Kiro/issues/9435), open,
|
|
139
|
+
asks for a git ref stamped into spec metadata and a warning when referenced code changed.
|
|
140
|
+
|
|
141
|
+
**Where loam differs**
|
|
142
|
+
|
|
143
|
+
- A cross-service change is one feature with a requirement delta for each service it touches, and
|
|
144
|
+
each service's part is computed: `loam delta <FEAT> --service <id>` is that service's slice, and
|
|
145
|
+
`loam tasks` lists the work per service, providers before consumers. That is the routing #725
|
|
146
|
+
asks for, held as data rather than executed. loam clones nothing and opens no pull request;
|
|
147
|
+
running an agent in each repository is the host's job — Kiro Web's, or a cloud agent's.
|
|
148
|
+
- The joins between services are exact tokens that `loam validate` grades: a call edge's `op`
|
|
149
|
+
against the provider's OpenAPI `operationId`, a requirement's `Operations:` line against its own
|
|
150
|
+
contract. Spec Kit's guide leaves that agreement to people, and converge and the Cloud Agent ask
|
|
151
|
+
a model. loam asks no model and judges no meaning, so a requirement that is wrong but correctly
|
|
152
|
+
joined passes.
|
|
153
|
+
- Drift is detected by digests kept in the files: `sources.stale` when vouched code moves,
|
|
154
|
+
`content.stale` when vouched words move, and a digest on every generated scenario. The checks run
|
|
155
|
+
in each repository's CI and store nothing elsewhere. There is no dashboard, and nothing opens a
|
|
156
|
+
corrective pull request.
|
|
157
|
+
- Two gaps against these tools are open. loam has no per-requirement diff of a change against the
|
|
158
|
+
living spec like `openspec show --diff`: `loam delta` prints whole requirements, and
|
|
159
|
+
`loam archive --dry-run` says only which contract slots the merge quotes unchanged and which it
|
|
160
|
+
overwrites. And it has no analysis pass before code like Kiro's Analyze Requirements.
|
|
161
|
+
|
|
74
162
|
## The boundary
|
|
75
163
|
|
|
76
164
|
Every individual mechanism loam uses has neighbours with more depth in that mechanism. loam's
|
package/CONTRIBUTING.md
CHANGED
|
@@ -71,6 +71,43 @@ workflow. When adding a new suite that touches LikeC4, extend the workflow's sui
|
|
|
71
71
|
change. GitHub disables scheduled workflows after sixty days without repository activity, so after a
|
|
72
72
|
quiet stretch check that the canary is still enabled.
|
|
73
73
|
|
|
74
|
+
## The OpenSpec canary
|
|
75
|
+
|
|
76
|
+
[openspec-canary.yml](https://github.com/ybotok/loam/blob/main/.github/workflows/openspec-canary.yml)
|
|
77
|
+
is the same kind of early-warning smoke for the OpenSpec migration, weekly on Thursday with manual
|
|
78
|
+
dispatch. It resolves the newest `vX.Y.Z` OpenSpec tag with `git ls-remote`, shallow-clones it, and
|
|
79
|
+
runs `npm run test:openspec-corpus -- --baseline latest` against it. Like the LikeC4 canary it has no
|
|
80
|
+
push or pull-request trigger and blocks nothing. The certified claim is the exact-commit corpus job
|
|
81
|
+
in `ci.yml`, whose `release` pin is `OPENSPEC_BASELINES.release` in
|
|
82
|
+
`src/core/openspec/model/model.ts`. When the newest tag is that pin, the sweep re-checks it exactly
|
|
83
|
+
and the summary says there is nothing newer.
|
|
84
|
+
|
|
85
|
+
What a red run means, by failing step. A red sweep means a file in the newest upstream corpus no
|
|
86
|
+
longer survives the migration's read/serialize/read round trip; the log names the file. A red audit
|
|
87
|
+
means `audit-openspec` could not complete on OpenSpec's own workspace — a YAML, root or I/O refusal,
|
|
88
|
+
not a blocker, since blockers are only listed. A red resolve or clone step is infrastructure: GitHub,
|
|
89
|
+
or a tag scheme upstream changed. The parser-source diff never fails. It warns when upstream's
|
|
90
|
+
readers (`src/core/parsers/`), archive merge (`src/core/specs-apply.ts`) or validation rules
|
|
91
|
+
(`src/core/validation/`) moved since the pin, and it is the step to read first. The 1.13 grammar
|
|
92
|
+
changes appeared in no upstream spec file, so a green sweep says nothing about them.
|
|
93
|
+
|
|
94
|
+
Reproduce locally:
|
|
95
|
+
|
|
96
|
+
```sh
|
|
97
|
+
git clone --depth 1 --branch <tag> https://github.com/Fission-AI/OpenSpec.git /tmp/OpenSpec
|
|
98
|
+
npm run test:openspec-corpus -- --baseline latest /tmp/OpenSpec
|
|
99
|
+
npm run dev -- audit-openspec /tmp/OpenSpec
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Moving the pin is an ordinary pull request. Run the sweep and the documented audit, mapping and
|
|
103
|
+
staged-apply path against the new release. Read the parser diff and give loam's OpenSpec reader
|
|
104
|
+
(`src/core/openspec/scan/shape.ts`) whatever grammar it shows, each with a test. Then update
|
|
105
|
+
`OPENSPEC_BASELINES.release` and the `release` totals in `scripts/openspec-corpus.ts`, the `ci.yml`
|
|
106
|
+
matrix, and the pin tables in MIGRATING-from-OpenSpec.md and `test/fixtures/openspec/README.md`.
|
|
107
|
+
The outgoing release becomes the `previous` pin, and the pin it displaces either gets a name of its
|
|
108
|
+
own or a recorded reason to go. The banner and `baselines.release` under `--json` change, so the
|
|
109
|
+
move needs a CHANGELOG entry.
|
|
110
|
+
|
|
74
111
|
## Releases
|
|
75
112
|
|
|
76
113
|
Only maintainers create release tags. A release is driven by an exact `v<package.version>` tag and
|
|
@@ -6,30 +6,47 @@ is measured, not inferred from a successful directory walk.
|
|
|
6
6
|
|
|
7
7
|
## Version matrix
|
|
8
8
|
|
|
9
|
-
> **Compatibility boundary:** the v1.
|
|
10
|
-
> migration boundary documented here. That boundary is the Markdown and the staged
|
|
11
|
-
> OpenSpec's behavior: `audit-openspec` inventories
|
|
12
|
-
>
|
|
13
|
-
> semantics.
|
|
9
|
+
> **Compatibility boundary:** the v1.14.1 exact-commit corpus is certified for the parser and
|
|
10
|
+
> one-way migration boundary documented here. That boundary is the Markdown and the staged
|
|
11
|
+
> migration, not OpenSpec's behavior: `audit-openspec` inventories the workspace shapes v1.8
|
|
12
|
+
> introduced and v1.14.1 still uses, and loam does not reimplement OpenSpec validation, archive
|
|
13
|
+
> recovery, capability retirement, Store or agent-delivery semantics.
|
|
14
14
|
|
|
15
15
|
| OpenSpec source | Exact pin | loam coverage | Status |
|
|
16
16
|
|---|---|---|---|
|
|
17
|
-
| [v1.
|
|
18
|
-
|
|
|
19
|
-
| [v1.
|
|
20
|
-
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
17
|
+
| [v1.14.1 release](https://github.com/Fission-AI/OpenSpec/releases/tag/v1.14.1) | `87c3595ace6a2e22957f39ebe5b74c2f2316e0cb`, released 2026-10-05 | Full living + active + archived Markdown corpus sweep through the migration's own reader, the 1.13 requirement grammar described below, and the documented audit/mapping/staged-apply path, run against OpenSpec's own v1.14.1 workspace. | **Certified for this documented parser/migration boundary.** It is not bidirectional OpenSpec compatibility. |
|
|
18
|
+
| v1.10.0 – v1.14.0 releases | — | Carried by the v1.14.1 corpus and grammar; no exact sweep of their own runs. | **Superseded by the certified v1.14.1 pin.** |
|
|
19
|
+
| [v1.9.0 release](https://github.com/Fission-AI/OpenSpec/releases/tag/v1.9.0) | `2826b8889e5223a9a8095d4428b60b56597e1020`, released 2026-08-13 | The previously certified corpus, still swept file by file; the seven verbatim regression fixtures are vendored from this commit. | **Regression pin.** A parser change may not fix the current corpus by breaking the one somebody already migrated from. |
|
|
20
|
+
| [v1.8.0 release](https://github.com/Fission-AI/OpenSpec/releases/tag/v1.8.0) | `d57889664cab4f2f061d236ec3ff82a5578701bb`, released 2026-08-05 | Audit inventories or preserves modern planning roots, Stores, nested capability paths, config context/rules/references, custom schemas/templates, per-change metadata, `skip_specs`, `RENAMED`, and authored artifacts. | **Inventoried, and superseded.** No v1.8 exact-release sweep of its own runs; the shapes v1.8 introduced are carried by the v1.9.0 and v1.14.1 corpora. |
|
|
21
|
+
| [v1.7.0 release](https://github.com/Fission-AI/OpenSpec/releases/tag/v1.7.0) | `4e16790d90d8f54d4773ad9a5e71a57cd9f1e86b` | An older certified corpus, still swept file by file. | **Regression pin**, for the same reason. |
|
|
22
|
+
| Historical post-v1.7 `main` canary | `45cca5db6137ed209117cc70510eb3e057fb981b` | A further exact living + active + archived parser corpus. | **Regression pin only.** It is not a release and not a moving claim. |
|
|
23
|
+
| Newest upstream release | None: the newest `vX.Y.Z` tag, resolved each week | The same sweep without a pin (`--baseline latest`), an audit of OpenSpec's own workspace, and a diff of upstream's parser sources against the certified pin, in [openspec-canary.yml](https://github.com/ybotok/loam/blob/main/.github/workflows/openspec-canary.yml). | **Early warning, never a certification.** A red canary means upstream moved; it blocks no pull request and no release. |
|
|
24
|
+
|
|
25
|
+
The seven verbatim fixtures come from the v1.9.0 commit and run in routine CI. At v1.14.1 five are
|
|
26
|
+
byte-identical and the other two gained only prose and scenarios of shapes the set already holds, so
|
|
27
|
+
the set was not re-vendored. A scheduled/manual matrix separately sweeps all four pinned commits
|
|
28
|
+
across living, active, and archived spec trees: v1.14.1 223 files / 765 requirements / 2475
|
|
29
|
+
scenarios; v1.9.0 211 / 746 / 2317; v1.7.0 207 / 739 / 2273; canary 209 / 742 / 2284. These test
|
|
30
|
+
requirement/scenario parsing, not every workspace feature. The
|
|
26
31
|
[fixture provenance, immutable upstream paths, and checksums](https://github.com/ybotok/loam/blob/main/test/fixtures/openspec/README.md)
|
|
27
32
|
and the [compatibility tests](https://github.com/ybotok/loam/blob/main/test/openspec-compat.test.ts)
|
|
28
33
|
use absolute GitHub URLs because this guide is also shipped in the npm tarball while `test/` is not.
|
|
29
34
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
35
|
+
**What moved between v1.9.0 and v1.14.1.** OpenSpec 1.13.0 and 1.13.1 changed the requirement
|
|
36
|
+
grammar: a `*` or `+` bullet lists a `REMOVED` requirement or a `RENAMED` pair exactly as `-`
|
|
37
|
+
always did, a heading's closing `#` run (`### Requirement: Late fees ###`) is not part of the
|
|
38
|
+
requirement's name, and a delta file may repeat a section header with every copy applied.
|
|
39
|
+
`audit-openspec` and `migrate-openspec` read all four the way OpenSpec does. 1.13.1 also stopped
|
|
40
|
+
counting a bare `#### Scenario:` header with no body as a scenario; loam keeps it, and
|
|
41
|
+
`loam validate` names it stepless in the staged target. The rest of v1.10–v1.14 — `show --diff`,
|
|
42
|
+
`status --all`, `validate --archived`, Store-backed apply, new agent targets — is OpenSpec behavior,
|
|
43
|
+
outside the boundary above.
|
|
44
|
+
|
|
45
|
+
The certification run read OpenSpec's own v1.14.1 workspace: 36 capabilities, 30 active and 85
|
|
46
|
+
archived changes. With the one change still at the proposal stage set aside (the
|
|
47
|
+
`openspec.change-no-specs` case below), apply staged all 251 living requirements and 747 scenarios
|
|
48
|
+
across 36 services, and 145 requirements across 29 features. Its planning roots, artifact kinds and
|
|
49
|
+
change-metadata fields were the ones the v1.9.0 run met.
|
|
33
50
|
|
|
34
51
|
An audit result of `ready: true` means that the particular files the installed loam inspected
|
|
35
52
|
satisfy loam's documented migration checks. It is not a statement that every behavior of the
|
|
@@ -251,11 +268,12 @@ review material until the follow-up checklist is complete.
|
|
|
251
268
|
## What carries over mechanically
|
|
252
269
|
|
|
253
270
|
The exact-commit corpus gate checks living, active, and archived spec trees. The certified corpus is
|
|
254
|
-
the OpenSpec v1.
|
|
255
|
-
The v1.
|
|
256
|
-
2284) remain as regression sweeps. All
|
|
257
|
-
|
|
258
|
-
|
|
271
|
+
the OpenSpec v1.14.1 release `87c3595`: 223 Markdown files, 765 requirements, and 2475 scenarios.
|
|
272
|
+
The v1.9.0 release `2826b88` (211, 746, 2317), the v1.7.0 release `4e16790` (207, 739, 2273) and
|
|
273
|
+
the post-v1.7 main canary `45cca5d` (209, 742, 2284) remain as regression sweeps. All four read
|
|
274
|
+
each file as the migration does and check read/serialize/read stability of requirement content.
|
|
275
|
+
Nested bullets, fenced markup, removal prose, CRLF, BOM and non-ASCII names survive. `REMOVED`
|
|
276
|
+
requirements with no scenarios remain legal.
|
|
259
277
|
|
|
260
278
|
Modern ADDED/MODIFIED/REMOVED deltas are readable, but “readable” is not “ready”: routing to
|
|
261
279
|
services, loam frontmatter, Operations/Covers links and feature identity still require decisions.
|
package/QUICKSTART.md
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
# loam quick start
|
|
2
2
|
|
|
3
|
-
From installation to the first agent-driven change, with the smallest useful setup.
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
From installation to the first agent-driven change, with the smallest useful setup. Section 2 is
|
|
4
|
+
ten minutes with the CLI alone — no agent, no service checkout, no adoption — and shows the check
|
|
5
|
+
only a fleet-wide map can make: a call between two services that names an operation the provider
|
|
6
|
+
does not have. From section 3 on, the guide uses one application and a local docs directory. A real
|
|
7
|
+
fleet normally keeps that directory in a separate repository; the commands and chat flow stay the
|
|
8
|
+
same.
|
|
6
9
|
|
|
7
10
|
## 1. Install
|
|
8
11
|
|
|
@@ -16,7 +19,167 @@ loam --version
|
|
|
16
19
|
A project-local install works too: `npm install --save-dev @ybotok/loam`, then replace `loam` below
|
|
17
20
|
with `npx loam`.
|
|
18
21
|
|
|
19
|
-
## 2.
|
|
22
|
+
## 2. Ten minutes, CLI only: the fleet spine
|
|
23
|
+
|
|
24
|
+
Nothing here needs requirement Markdown, `loam adopt` or `loam vouch` — only the map and a contract
|
|
25
|
+
you already have. In an empty directory, write `fleet.yaml`: the services, and who calls whom.
|
|
26
|
+
|
|
27
|
+
```yaml
|
|
28
|
+
services:
|
|
29
|
+
- order-service
|
|
30
|
+
- payment-service
|
|
31
|
+
|
|
32
|
+
calls:
|
|
33
|
+
- order-service -> payment-service
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Make the docs repo there, and let `seed` draw the map from that file:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
loam init --docs . --create
|
|
40
|
+
loam seed --from fleet.yaml
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
```text
|
|
44
|
+
architecture/landscape.likec4 written (replaced the scaffold's untouched stub) — 2 service(s), 1 call(s), from fleet.yaml
|
|
45
|
+
+ architecture/landscape.likec4
|
|
46
|
+
+ services/order-service/.gitkeep
|
|
47
|
+
+ services/payment-service/.gitkeep
|
|
48
|
+
+ architecture/services.likec4
|
|
49
|
+
|
|
50
|
+
Next:
|
|
51
|
+
loam validate --all
|
|
52
|
+
loam list --needs-work
|
|
53
|
+
loam adopt --service order-service
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Now the two things only you can do. First, put the provider's existing contract at
|
|
57
|
+
`services/payment-service/openapi.yaml` — copy the one its build produces; loam never generates it
|
|
58
|
+
and never reads the code. For this walk-through, one operation is enough:
|
|
59
|
+
|
|
60
|
+
```yaml
|
|
61
|
+
openapi: 3.1.0
|
|
62
|
+
info:
|
|
63
|
+
title: payment-service
|
|
64
|
+
version: 1.0.0
|
|
65
|
+
paths:
|
|
66
|
+
/payments:
|
|
67
|
+
post:
|
|
68
|
+
operationId: authorizePayment
|
|
69
|
+
responses:
|
|
70
|
+
"201":
|
|
71
|
+
description: Authorized
|
|
72
|
+
content:
|
|
73
|
+
application/json:
|
|
74
|
+
schema: { type: object }
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Second, name the operation on the call edge in `architecture/landscape.likec4`. `seed` drew the
|
|
78
|
+
edge bare; replace that line with this one, spelled the British way on purpose:
|
|
79
|
+
|
|
80
|
+
```likec4
|
|
81
|
+
svc_order_service -> svc_payment_service 'Authorises the order' {
|
|
82
|
+
metadata { op 'authorisePayment' }
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
loam validate --all --errors-only
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
```text
|
|
91
|
+
No C4 model at <docs>/services/order-service/model.likec4. Run `loam adopt` for 'order-service' first. (service.no-model)
|
|
92
|
+
No C4 model at <docs>/services/payment-service/model.likec4. Run `loam adopt` for 'payment-service' first. (service.no-model)
|
|
93
|
+
⚠ payment-service: 1 operation(s) not governed by any requirement — authorizePayment (api.ungoverned)
|
|
94
|
+
✗ payment-service: landscape edge order-service → payment-service calls 'authorisePayment', not defined in payment-service's OpenAPI (spine.op-undefined)
|
|
95
|
+
|
|
96
|
+
2 services, 0 features — 3 errors, 3 warnings
|
|
97
|
+
⚠ requirements axis not started fleet-wide (0 of 2 services), expected during staged adoption — 2 warning(s) grouped: service.no-spec×2; every finding is unchanged in --json
|
|
98
|
+
|
|
99
|
+
→ `loam explain <code>` says what a code means and how to fix it
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
(`<docs>` is the absolute path of the directory; a fleet scorecard follows, cut here.) The last
|
|
103
|
+
`✗` line is the one you came for: one letter between the map and the provider's contract, an
|
|
104
|
+
**error**, and no other check a team normally runs would see it. `loam explain spine.op-undefined`
|
|
105
|
+
says what it means and what to do. The two `service.no-model` errors are not misconfiguration:
|
|
106
|
+
they are a truthful reading of a fleet where adoption has not started, and they stay until each
|
|
107
|
+
service has a model. Spell the operation `authorizePayment` and the `✗` line is gone — the edge now
|
|
108
|
+
reads `spine.resolved` in `--json`. Committed, this directory is a docs repo, and README's
|
|
109
|
+
[PR recipe](README.md#guard-the-fleets-edges-on-every-pr) guards these edges on every pull request
|
|
110
|
+
from here on — `loam diff --base` names who still calls an operation a branch removes.
|
|
111
|
+
|
|
112
|
+
A change can start before any adoption, too. A feature that only states requirements needs no C4
|
|
113
|
+
delta and no contract change:
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
loam new FEAT-1 --title "Idempotent payment authorization" --touches order-service --touches payment-service
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
```text
|
|
120
|
+
FEAT-1 scaffolded at features/FEAT-1-idempotent-payment-authorization
|
|
121
|
+
+ features/FEAT-1-idempotent-payment-authorization/intent.md
|
|
122
|
+
+ features/FEAT-1-idempotent-payment-authorization/delta.likec4
|
|
123
|
+
+ features/FEAT-1-idempotent-payment-authorization/specs/order-service/spec.md
|
|
124
|
+
+ features/FEAT-1-idempotent-payment-authorization/specs/payment-service/spec.md
|
|
125
|
+
|
|
126
|
+
Next: fill in the delta, then `loam validate --feature FEAT-1`.
|
|
127
|
+
If this feature changes no architecture, delete delta.likec4 — a requirements-only
|
|
128
|
+
feature is complete without it, and an empty `model {}` validates clean too.
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
Delete `delta.likec4`, write the intent's Why and Scope and its `owner`, and replace each
|
|
132
|
+
`specs/<service>/spec.md` with the requirement that service takes on — the file's comment carries
|
|
133
|
+
the template. payment-service's, for example:
|
|
134
|
+
|
|
135
|
+
```markdown
|
|
136
|
+
# payment-service — requirement delta for FEAT-1
|
|
137
|
+
|
|
138
|
+
## ADDED Requirements
|
|
139
|
+
|
|
140
|
+
### Requirement: Authorize a payment once per idempotency key
|
|
141
|
+
Requirement-ID: PAY-AUTHORIZE-IDEMPOTENT
|
|
142
|
+
Operations: authorizePayment
|
|
143
|
+
|
|
144
|
+
The service SHALL return the original authorization, and charge nothing, when a request repeats an
|
|
145
|
+
idempotency key it has already authorized.
|
|
146
|
+
|
|
147
|
+
#### Scenario: A retried authorization is not charged twice
|
|
148
|
+
- **Given** a payment authorized under idempotency key K
|
|
149
|
+
- **When** an authorization request arrives again with key K
|
|
150
|
+
- **Then** the response carries the original authorization and no second charge is made
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
loam validate --feature FEAT-1
|
|
155
|
+
loam archive FEAT-1 --dry-run
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
```text
|
|
159
|
+
FEAT-1
|
|
160
|
+
✓ order-service: requirements covered (1 requirement, all with scenarios)
|
|
161
|
+
✓ payment-service: requirements covered (1 requirement, all with scenarios)
|
|
162
|
+
coherence: ✓ C4 · requirements · OpenAPI agree
|
|
163
|
+
archive FEAT-1 (dry run)
|
|
164
|
+
|
|
165
|
+
requirements: order-service — created living spec.md (1 requirement(s))
|
|
166
|
+
requirements: payment-service — created living spec.md (1 requirement(s))
|
|
167
|
+
|
|
168
|
+
plan — 2 file(s):
|
|
169
|
+
create services/order-service/spec.md
|
|
170
|
+
create services/payment-service/spec.md
|
|
171
|
+
move features/FEAT-1-idempotent-payment-authorization → features/archive/FEAT-1-idempotent-payment-authorization
|
|
172
|
+
|
|
173
|
+
dry run — nothing was written.
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
The archive would write each service's first living `spec.md` from the change itself, and the
|
|
177
|
+
`Operations:` line already joins payment-service's requirement to the contract above. That is the
|
|
178
|
+
small-change loop WORKFLOW.md calls
|
|
179
|
+
[the honestly-small change](WORKFLOW.md#the-honestly-small-change), used as a first entry. The adoption below is still how a service's existing behaviour gets written down; this is
|
|
180
|
+
how a change that cannot wait for it starts.
|
|
181
|
+
|
|
182
|
+
## 3. Wire one project
|
|
20
183
|
|
|
21
184
|
Run this in the code repository you want to govern:
|
|
22
185
|
|
|
@@ -30,14 +193,21 @@ boundary `commerce-app`, and installs command and Agent Skill pointers for the A
|
|
|
30
193
|
Commit the generated `loam.json`, agent files and docs directory. Use your real stable service or
|
|
31
194
|
application id instead of `commerce-app`.
|
|
32
195
|
|
|
33
|
-
`--create` is only for a new docs repo. To join an existing shared docs repo
|
|
196
|
+
`--create` is only for a new docs repo. To join an existing shared docs repo from one service's
|
|
197
|
+
checkout, use:
|
|
34
198
|
|
|
35
199
|
```bash
|
|
36
|
-
loam init --docs ../architecture-docs --service commerce-app
|
|
200
|
+
loam init --docs ../architecture-docs --service commerce-app --agent-profile service
|
|
37
201
|
loam doctor
|
|
38
202
|
```
|
|
39
203
|
|
|
40
|
-
|
|
204
|
+
`--agent-profile service` installs the entry points that run beside the code — adopt, implement,
|
|
205
|
+
check, verify and report — and leaves feature authoring and shipping to the shared docs repo,
|
|
206
|
+
which takes `--agent-profile docs` when its own `loam init` runs. Without the flag every checkout
|
|
207
|
+
gets all seven. The one-project setup above keeps all seven on purpose: there, the code repo is
|
|
208
|
+
also where features are written and shipped.
|
|
209
|
+
|
|
210
|
+
## 4. Adopt what already exists
|
|
41
211
|
|
|
42
212
|
In chat, use the explicit entry point:
|
|
43
213
|
|
|
@@ -57,7 +227,7 @@ Most hosts use `/loam-adopt`; Gemini uses `/loam:adopt`, Amazon Q uses `@loam-ad
|
|
|
57
227
|
skills-only host can use `$loam-adopt`. A natural-language request such as “adopt commerce-app into
|
|
58
228
|
loam” may load the same skill automatically, but the explicit spelling is the predictable path.
|
|
59
229
|
|
|
60
|
-
##
|
|
230
|
+
## 5. Make the first change
|
|
61
231
|
|
|
62
232
|
For this one-project setup, stay in the wired code repo: its `loam.json` resolves `loam-docs/`, and
|
|
63
233
|
its generated agent entries are already present. In a separately cloned team docs repo, run
|
|
@@ -90,7 +260,7 @@ loam status --json
|
|
|
90
260
|
Its ordered `next[]` is the work queue. The agent runs an entry only when `next[].execution.runnable`
|
|
91
261
|
is true; edits, work in another checkout and human review stay visibly different.
|
|
92
262
|
|
|
93
|
-
##
|
|
263
|
+
## 6. When something behaves badly
|
|
94
264
|
|
|
95
265
|
Use the support entry point; it is not another lifecycle step:
|
|
96
266
|
|
|
@@ -124,6 +294,8 @@ only pointers whose recorded digest still matches; a file your team edited remai
|
|
|
124
294
|
- [WORKFLOW.md](WORKFLOW.md) explains the complete lifecycle and human/agent boundary.
|
|
125
295
|
- [SCHEMA.md](SCHEMA.md) defines every docs-repo artifact and join.
|
|
126
296
|
- [COMPARISON.md](COMPARISON.md) explains where loam fits beside neighboring tools.
|
|
297
|
+
- [docs/SERVICE-TEAMS.md](https://github.com/ybotok/loam/blob/main/docs/SERVICE-TEAMS.md) is the
|
|
298
|
+
one screen for a team whose repository is one service in a fleet.
|
|
127
299
|
- [MIGRATING-from-OpenSpec.md](MIGRATING-from-OpenSpec.md) covers an OpenSpec migration.
|
|
128
300
|
|
|
129
301
|
Three rules prevent most surprises: use `--create` only once, let a human vouch, and branch on JSON
|