yarramate 0.13.0 → 0.15.0

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.
Files changed (55) hide show
  1. package/README.md +185 -145
  2. package/catalogues/core-enrichment.yaml +98 -4
  3. package/dist/adapter-mapping.js +1 -2
  4. package/dist/adapters/likec4-cli.js +2 -4
  5. package/dist/adapters/likec4-kind-mapping.js +1 -2
  6. package/dist/adapters/likec4-project.js +1 -2
  7. package/dist/apply-command.js +160 -12
  8. package/dist/ask-command.js +181 -28
  9. package/dist/attestation-staleness.d.ts +6 -0
  10. package/dist/attestation-staleness.js +210 -0
  11. package/dist/brief.d.ts +4 -2
  12. package/dist/brief.js +69 -3
  13. package/dist/changed.d.ts +6 -0
  14. package/dist/changed.js +4 -2
  15. package/dist/check-command.js +13 -1
  16. package/dist/cli-support.d.ts +2 -2
  17. package/dist/cli-support.js +2 -3
  18. package/dist/cli.js +11 -1
  19. package/dist/compiler.js +197 -4
  20. package/dist/core-contract.js +1 -2
  21. package/dist/design-command.js +25 -6
  22. package/dist/evidence.d.ts +7 -3
  23. package/dist/evidence.js +14 -5
  24. package/dist/export-command.js +39 -7
  25. package/dist/index.d.ts +4 -2
  26. package/dist/index.js +3 -1
  27. package/dist/interrogate-command.d.ts +4 -0
  28. package/dist/interrogate-command.js +95 -5
  29. package/dist/profile.d.ts +18 -3
  30. package/dist/profile.js +23 -6
  31. package/dist/projection.d.ts +1 -1
  32. package/dist/projection.js +19 -3
  33. package/dist/reconciliation.d.ts +51 -2
  34. package/dist/reconciliation.js +114 -3
  35. package/dist/rtm.d.ts +90 -0
  36. package/dist/rtm.js +370 -0
  37. package/dist/source-document.d.ts +1 -1
  38. package/dist/subject-identity.d.ts +34 -0
  39. package/dist/subject-identity.js +222 -0
  40. package/dist/workspace.js +1 -2
  41. package/package.json +6 -5
  42. package/schema/yarramate-apply-result.schema.json +6 -2
  43. package/schema/yarramate-ask-result.schema.json +65 -0
  44. package/schema/yarramate-design-step.schema.json +4 -0
  45. package/schema/yarramate-document.schema.json +62 -0
  46. package/schema/yarramate-evidence-report.schema.json +10 -0
  47. package/schema/yarramate-evidence.schema.json +15 -0
  48. package/schema/yarramate-operations.schema.json +115 -1
  49. package/schema/yarramate-profile.schema.json +7 -0
  50. package/schema/yarramate-question-catalogue.schema.json +17 -0
  51. package/schema/yarramate-reconciliation-report.schema.json +93 -1
  52. package/schema/yarramate-rtm.schema.json +204 -0
  53. package/skills/yarramate-architecture/SKILL.md +8 -1
  54. package/skills/yarramate-architecture/references/modelling-patterns.md +257 -0
  55. package/skills/yarramate-architecture/references/native-authoring.md +24 -3
package/README.md CHANGED
@@ -5,166 +5,221 @@
5
5
  [![CodeQL](https://github.com/yarrasys/yarramate/actions/workflows/codeql.yml/badge.svg)](https://github.com/yarrasys/yarramate/actions/workflows/codeql.yml)
6
6
  [![license: MIT](https://img.shields.io/github/license/yarrasys/yarramate)](LICENSE)
7
7
 
8
- YarraMate keeps your coding agents' architecture context correct. Declare
9
- the design once, as a checked model in git; agents receive prose rendered
10
- from it — bounded briefs and open design questions — and the CLI
8
+ **[yarramate.dev](https://yarramate.dev)** ·
9
+ [Case study](docs/CASE-STUDY-CROSS-HARNESS.md) ·
10
+ [Documentation](docs/README.md)
11
+
12
+ Your coding agents re-derive your system's design every session — and each
13
+ one derives it a little differently. The design document that could stop
14
+ them says whatever it said the day someone last edited it.
15
+
16
+ YarraMate keeps the design as a small, checked model in git instead. Agents
17
+ and people read prose rendered from it — bounded briefs and open design
18
+ questions — write decisions back through validated batches, and the CLI
11
19
  mechanically proves the model still matches the code as changes land.
12
20
 
13
- Prose is the interface; structure is the guarantee: every sentence an agent
14
- reads stands on a graph whose names resolve, whose drift is detected, and
15
- whose gaps are found deterministically.
21
+ There is no LLM inside and no service behind it: the engine is a
22
+ deterministic CLI, nothing leaves your repository, and git remains the only
23
+ governance a proposed change becomes architecture when a human merges it.
16
24
 
17
25
  > YarraMate is pre-release software. Interfaces may evolve before the first
18
26
  > stable release.
19
27
 
20
- ## Proven across harnesses
28
+ ## Two minutes to a model
21
29
 
22
- The design bet is that the model — not the session — is the state, so any
23
- agent in any harness can resume the work cold. We tested that adversarially
24
- on a real product: a Claude Code session worked the design interview all
25
- day, then an OpenAI Codex session — no shared context, the tool never
26
- named — resumed it from a ten-line pointer file and the published CLI. It
27
- answered 63 open design questions, filed two genuine defect reports, and in
28
- a later session reported that the model "was not merely documentation" — it
29
- caught an approval-path regression before the release shipped.
30
+ ```sh
31
+ npm install -g yarramate
30
32
 
31
- The full story, with every commit, PR, and release attached:
32
- [The model is the handover](docs/CASE-STUDY-CROSS-HARNESS.md).
33
+ yarramate init . # scaffold .yarramate/, write the agent pointer
34
+ yarramate design .yarramate/workspace.yaml # the interview: the top open design question
35
+ yarramate apply answers.yaml .yarramate/workspace.yaml # answers land as one atomic batch
36
+ yarramate check .yarramate/workspace.yaml # names resolve and rules hold — or it says where not
37
+ ```
33
38
 
34
- ## Why YarraMate?
39
+ The whole surface is seven verbs, one per lifecycle stage:
35
40
 
36
- Architecture documents often drift away from implementation or become tied to
37
- one notation and tool. YarraMate keeps concise, native YAML documents
38
- canonical and compiles them into an explicit semantic graph.
41
+ ```text
42
+ init design apply ask check → reconcile → export
43
+ create fill write read gate drift derive
44
+ ```
39
45
 
40
- The same model supports two workflows:
46
+ `design` recomputes the next open question from the model itself there is
47
+ no session state anywhere. That is the design bet: the model, not the
48
+ session, is the state, so any agent in any harness resumes the interview
49
+ cold, and a crashed session or a vendor switch costs nothing.
41
50
 
42
- - discover an existing project's architecture from repository evidence;
43
- - design a solution before implementation and later reconcile intent with
44
- evidence.
51
+ ## Every fact is a claim
45
52
 
46
- Git provides authorship, review, history, and acceptance. YarraMate does not
47
- introduce a parallel governance workflow.
53
+ What you author plain YAML in git:
48
54
 
49
- ## Product boundaries
55
+ ```yaml
56
+ concepts:
57
+ - id: order-gateway
58
+ kind: applicationComponent
59
+ name: Order Gateway
60
+ status: current
61
+ ```
50
62
 
51
- YarraMate Core:
63
+ What the engine checks — a claim in the compiled graph, with provenance:
52
64
 
53
- - owns native, versioned architecture documents;
54
- - compiles a claim-centred, tool-neutral semantic graph;
55
- - checks deterministic correctness rather than architectural taste;
56
- - supports explicit workspaces, profiles, projections, evidence, and
57
- architecture states;
58
- - exposes a stable CLI for people, CI, skills, and agent harnesses.
65
+ ```json
66
+ {
67
+ "subject": "orders#order-gateway",
68
+ "predicate": "yarramate/concept/kind",
69
+ "value": "yarramate/core@0.1#applicationComponent",
70
+ "origin": "declared",
71
+ "source": { "document": "orders", "line": 3, "column": 5 }
72
+ }
73
+ ```
59
74
 
60
- Optional adapters provide:
75
+ What an agent reads — deterministic prose rendered from the graph:
61
76
 
62
- - LikeC4 visualization from semantic projections;
63
- - Graphify observations as evidence overlays;
64
- - separately governed compatibility profiles for external languages.
77
+ > "Order Gateway is an application component; it already exists in this
78
+ > system."
65
79
 
66
- Core does not depend on LikeC4, Graphify, or ArchiMate.
80
+ Every sentence stands on claims, and every claim cites the file and line it
81
+ came from. The same YAML compiles to a byte-identical graph and the same
82
+ sentence, every time. There is no other structure to learn: concepts,
83
+ relationships, statuses, owners, and evidence are all claims.
67
84
 
68
- YarraMate is not affiliated with or certified by The Open Group. ArchiMate® is
69
- a registered trademark of The Open Group. LikeC4 and Graphify are independent
70
- projects; their mention does not imply affiliation or endorsement.
85
+ ## What structure buys
71
86
 
72
- ## Repository layout
87
+ Three things prose alone can't do — and deliberately the whole list:
73
88
 
74
- ```text
75
- src/ compiler, CLI, graph, and adapter sources
76
- schema/ normative JSON Schemas
77
- test/ tests and acceptance fixtures
78
- skills/ portable architecture workflow for agent harnesses
79
- .claude-plugin/ plugin marketplace manifest offering that skill
80
- docs/ contracts, guides, and decisions
81
- .yarramate/ canonical dogfooded architecture
82
- .yarramate-out/ reproducible generated output (ignored)
83
- ```
89
+ - **Identity** — a stable name every agent agrees on. References resolve or
90
+ the model doesn't compile; two sessions can't invent two names for the
91
+ same component.
92
+ - **Verifiability** — internal consistency and drift against the code,
93
+ checked mechanically. A claim of "current" without supporting evidence is
94
+ flagged the moment it becomes checkable, and `reconcile` reports both
95
+ sides of every disagreement without auto-fixing either.
96
+ - **Sliceability** — each implementer receives exactly its neighbourhood: a
97
+ bounded, deterministic brief rendered from the model, so parallel agents
98
+ share one map.
84
99
 
85
- The [documentation index](docs/README.md) links the public guides and
86
- maintainer material. Start semantic work with the
87
- [product contract](docs/PRODUCT-CONTRACT.md) and
88
- [glossary](docs/GLOSSARY.md).
100
+ Anything a good document does as well, we leave to your documents. The model
101
+ holds only what nothing can derive from code: what's planned, what was
102
+ deliberately retired, who owns what, and why.
89
103
 
90
- ## Development
104
+ ## Proven across harnesses
105
+
106
+ We tested the handover bet adversarially on a real product: a Claude Code
107
+ session worked the design interview all day, then an OpenAI Codex session —
108
+ no shared context, the tool never named in the prompt — resumed it from a
109
+ ten-line pointer file and the published CLI. It answered 63 open design
110
+ questions, filed two genuine defect reports, and in a later session reported
111
+ that the model "was not merely documentation" — it caught an approval-path
112
+ regression before the release shipped.
91
113
 
92
- Requirements:
114
+ The full story, with every commit, PR, and release attached:
115
+ [The model is the handover](docs/CASE-STUDY-CROSS-HARNESS.md).
93
116
 
94
- - Node.js 22 or newer
95
- - Corepack
117
+ ## Research, honestly
96
118
 
97
- ```sh
98
- corepack enable
99
- pnpm install --frozen-lockfile
100
- pnpm run verify
101
- ```
119
+ We benchmark our own claims and publish the misses alongside the wins:
102
120
 
103
- The full CI command runs typechecking, tests, native self-validation, LikeC4
104
- generation, and LikeC4 validation.
121
+ - **Held** cross-harness handover; elicitation (tool-equipped agents
122
+ across three model tiers reached a green check first try, 5/5, and
123
+ converged on a design question zero freehand frontier runs ever asked);
124
+ lie resistance (five builds from deliberately corrupted models — zero
125
+ lies reached code).
126
+ - **Not held** — under a strong external spec, a checked model did not
127
+ measurably beat a good design document on build convergence. We ran that
128
+ experiment and published it.
129
+
130
+ Results with full transcripts, diffs, and the adjudication trail:
131
+ [docs/research/context-benchmark](docs/research/context-benchmark) and
132
+ [yarramate-bench-results](https://github.com/yarrasys/yarramate-bench-results).
133
+
134
+ And honestly: maintaining a model is rent. Two things make it payable —
135
+ agents do most of the authoring through the interview loop, and the engine
136
+ tells you exactly what's missing instead of leaving completeness to
137
+ discipline. It pays when more than one agent, session, or human has to
138
+ share the same map.
105
139
 
106
- Useful focused commands:
140
+ ## For AI agents
141
+
142
+ If you are an agent working in a repository with a `.yarramate/` workspace,
143
+ orientation is one call and the loop is three:
107
144
 
108
145
  ```sh
109
- pnpm build
110
- pnpm test
111
- pnpm typecheck
112
- pnpm self:check
113
- pnpm self:evidence
114
- pnpm self:reconcile
115
- pnpm self:check:likec4
116
- pnpm self:export:likec4
117
- pnpm docs:dev
146
+ yarramate ask .yarramate/workspace.yaml # verdict, drift summary, backlog — one round-trip
147
+ yarramate design .yarramate/workspace.yaml # the top open design question + its model slice
148
+ # answer with an operations batch, then:
149
+ yarramate apply operations.yaml .yarramate/workspace.yaml
118
150
  ```
119
151
 
120
- ## CLI
152
+ Re-run `design` for the next question. Stop with an uncommitted, reviewable
153
+ diff — merging is the human acceptance step, not yours.
154
+
155
+ - Every command takes `--json` and returns a versioned, schema-backed
156
+ envelope; writes are atomic batches that compile as a whole workspace or
157
+ are rejected outright, so you cannot half-corrupt a document.
158
+ - `ask` accepts free text (`yarramate ask <ws> "billing"`), `--subjects`
159
+ for the full roster, `--where` for evidence-backed pointing, and
160
+ `--changed <git-range>` for review slices.
161
+ - `export rtm <ws> --out <dir>` derives the requirements traceability
162
+ matrix: every requirement traced to its motivation, realizers, evidence
163
+ verdicts, and attestations, with a `path:line` citation per cell.
164
+ - `init` writes the discovery pointer into both `AGENTS.md` and
165
+ `CLAUDE.md`, so this section finds you rather than the reverse.
166
+ - `yarramate-mcp` exposes four read-only tools (ask/design/check/reconcile)
167
+ over MCP stdio.
168
+ - In Claude Code, this repository is its own plugin marketplace:
169
+
170
+ ```sh
171
+ /plugin marketplace add yarrasys/yarramate
172
+ /plugin install yarramate-architecture@yarramate
173
+ ```
174
+
175
+ The full agent contract is [docs/AGENT-INTERFACE.md](docs/AGENT-INTERFACE.md).
121
176
 
122
- Install the published executable or invoke it directly with `npx`:
177
+ ## Product boundaries
123
178
 
124
- ```sh
125
- npm install --global yarramate
126
- yarramate --help
179
+ YarraMate Core owns native, versioned architecture documents; compiles a
180
+ claim-centred, tool-neutral semantic graph; checks deterministic correctness
181
+ rather than architectural taste; supports explicit workspaces, profiles,
182
+ projections, evidence, and architecture states; and exposes a stable CLI for
183
+ people, CI, skills, and agent harnesses.
127
184
 
128
- npx yarramate check .yarramate/workspace.yaml
129
- npx yarramate ask .yarramate/workspace.yaml
130
- ```
185
+ Optional adapters provide LikeC4 visualization from semantic projections,
186
+ Graphify observations as evidence overlays, and separately governed
187
+ compatibility profiles for external languages. Core depends on none of them.
131
188
 
132
- The CLI is seven verbs, one per lifecycle stage:
189
+ YarraMate is not affiliated with or certified by The Open Group. ArchiMate®
190
+ is a registered trademark of The Open Group. LikeC4 and Graphify are
191
+ independent projects; their mention does not imply affiliation or
192
+ endorsement.
133
193
 
134
- ```text
135
- init → design → apply → ask → check → reconcile → export
136
- create fill write read gate drift derive
137
- ```
194
+ ## Development
138
195
 
139
- When developing the repository, build and invoke the same executable surface:
196
+ Requirements: Node.js 22 or newer, Corepack.
140
197
 
141
198
  ```sh
142
- pnpm build
143
-
144
- node dist/cli.js init .
145
- node dist/cli.js design .yarramate/workspace.yaml
146
- node dist/cli.js apply operations.yaml .yarramate/workspace.yaml
147
- node dist/cli.js ask .yarramate/workspace.yaml
148
- node dist/cli.js ask .yarramate/workspace.yaml "free text about the model"
149
- node dist/cli.js ask .yarramate/workspace.yaml --subjects
150
- node dist/cli.js ask .yarramate/workspace.yaml --advise "a design question"
151
- node dist/cli.js ask .yarramate/workspace.yaml --where "compiler"
152
- node dist/cli.js check .yarramate/workspace.yaml --json
153
- node dist/cli.js reconcile .yarramate/workspace.yaml
154
- node dist/cli.js export graph .yarramate/workspace.yaml
155
- node dist/cli.js export briefs .yarramate/projections/context.yaml .yarramate/workspace.yaml --out handoff
199
+ corepack enable
200
+ pnpm install --frozen-lockfile
201
+ pnpm run verify
156
202
  ```
157
203
 
158
- `init` creates `.yarramate/architecture/main.yaml` and
159
- `.yarramate/workspace.yaml` and delivers the agent pointer. `design`
160
- serves the top open design question; `apply` lands answers as one
161
- validated atomic batch; `ask` is every consumed-now read; `export`
162
- derives persisted artifacts. `check --strict` additionally fails when
163
- any evidence observation contradicts the model, for gates that want one
164
- knob. The full contract is
165
- [docs/AGENT-INTERFACE.md](docs/AGENT-INTERFACE.md).
204
+ The full CI command runs typechecking, tests, native self-validation, LikeC4
205
+ generation, and LikeC4 validation. Useful focused commands: `pnpm build`,
206
+ `pnpm test`, `pnpm typecheck`, `pnpm self:check`, `pnpm self:reconcile`,
207
+ `pnpm self:check:likec4`, `pnpm docs:dev`.
208
+
209
+ ```text
210
+ src/ compiler, CLI, graph, and adapter sources
211
+ schema/ normative JSON Schemas
212
+ test/ tests and acceptance fixtures
213
+ skills/ portable architecture workflow for agent harnesses
214
+ .claude-plugin/ plugin marketplace manifest offering that skill
215
+ docs/ contracts, guides, and decisions
216
+ .yarramate/ canonical dogfooded architecture
217
+ .yarramate-out/ reproducible generated output (ignored)
218
+ ```
166
219
 
167
- For a local consumer test, create a package artifact:
220
+ When developing the repository, build and invoke the same executable
221
+ surface: `pnpm build`, then `node dist/cli.js <verb> …` mirrors every
222
+ command above. For a local consumer test:
168
223
 
169
224
  ```sh
170
225
  pnpm pack --pack-destination /tmp/yarramate-package
@@ -172,16 +227,13 @@ npm install --global /tmp/yarramate-package/yarramate-*.tgz
172
227
  yarramate --help
173
228
  ```
174
229
 
175
- See [Consuming YarraMate](docs/CONSUMING-YARRAMATE.md) for the packaged CLI,
230
+ The [documentation index](docs/README.md) links the public guides and
231
+ maintainer material. Start semantic work with the
232
+ [product contract](docs/PRODUCT-CONTRACT.md) and
233
+ [glossary](docs/GLOSSARY.md). See
234
+ [Consuming YarraMate](docs/CONSUMING-YARRAMATE.md) for the packaged CLI,
176
235
  schemas, agent skill, and optional adapters.
177
236
 
178
- In Claude Code, this repository is its own plugin marketplace:
179
-
180
- ```sh
181
- /plugin marketplace add yarrasys/yarramate
182
- /plugin install yarramate-architecture@yarramate
183
- ```
184
-
185
237
  ## Library API
186
238
 
187
239
  The typed library exposes the same deep compiler seam:
@@ -195,27 +247,15 @@ const result = compileWorkspace([
195
247
  ```
196
248
 
197
249
  `compileWorkspaceWithProfileContext` additionally returns resolved profile
198
- lineage for operations that explicitly require kind ancestry. Graph v2 remains
199
- the stable, graph-only interchange result.
200
-
201
- Normative schemas are available through package exports such as:
202
-
203
- ```text
204
- yarramate/schema/document
205
- yarramate/schema/profile
206
- yarramate/schema/workspace
207
- yarramate/schema/graph-v2
208
- yarramate/schema/projection
209
- yarramate/schema/evidence
210
- yarramate/schema/core-contract
211
- ```
212
-
213
- Optional adapter entry points are exported from:
214
-
215
- ```text
216
- yarramate/adapter/likec4
217
- yarramate/adapter/graphify
218
- ```
250
+ lineage for operations that explicitly require kind ancestry. Graph v2
251
+ remains the stable, graph-only interchange result.
252
+
253
+ Normative schemas are available through package exports such as
254
+ `yarramate/schema/document`, `yarramate/schema/workspace`,
255
+ `yarramate/schema/graph-v2`, `yarramate/schema/projection`,
256
+ `yarramate/schema/evidence`, and `yarramate/schema/core-contract`. Optional
257
+ adapter entry points are exported from `yarramate/adapter/likec4` and
258
+ `yarramate/adapter/graphify`.
219
259
 
220
260
  ## Contributing and security
221
261
 
@@ -1,6 +1,6 @@
1
1
  format: yarramate/question-catalogue/v1
2
2
  id: core-enrichment
3
- version: "0.5"
3
+ version: "0.7"
4
4
  profile: yarramate/core@0.1
5
5
  presentation:
6
6
  title: Core enrichment interview
@@ -53,6 +53,9 @@ questions:
53
53
  - yarramate/core@0.1#outcome
54
54
  question: >-
55
55
  What outcome justifies this system's existence?
56
+ askPlain: >-
57
+ What would success look like for this system? What should be
58
+ different in the business because it exists?
56
59
  materiality: >-
57
60
  Without a declared goal or outcome, no alternative can be selected or
58
61
  rejected on grounds anyone can review; every later trade-off becomes
@@ -73,6 +76,9 @@ questions:
73
76
  - yarramate/core@0.1#driver
74
77
  question: >-
75
78
  Which stakeholders and drivers shape this architecture?
79
+ askPlain: >-
80
+ Who cares about this system, and what outside pressures are
81
+ pushing on it: customers, regulators, costs, deadlines?
76
82
  materiality: >-
77
83
  Drivers decide which qualities dominate when requirements conflict;
78
84
  unstated drivers get re-litigated in every review.
@@ -92,6 +98,9 @@ questions:
92
98
  - yarramate/core@0.1#requirement
93
99
  question: >-
94
100
  Which constraints and requirements are non-negotiable?
101
+ askPlain: >-
102
+ What are the hard rules here? Is there anything we absolutely
103
+ must do, or must never do, no matter which option we pick?
95
104
  materiality: >-
96
105
  Non-negotiable constraints eliminate alternatives outright; discovering
97
106
  them after design selection invalidates the selection.
@@ -116,6 +125,9 @@ questions:
116
125
  question: >-
117
126
  Nothing realizes {subject.name}. What fulfils it — or is it
118
127
  aspirational?
128
+ askPlain: >-
129
+ Nothing in the plan currently delivers "{subject.name}". What is
130
+ going to get us there? Or is it more of an aspiration for now?
119
131
  materiality: >-
120
132
  An unrealized goal either reprioritizes the roadmap or should be
121
133
  declared aspirational so it stops steering design.
@@ -124,7 +136,10 @@ questions:
124
136
  Add realization relationships from the fulfilling capability or
125
137
  service, record the aspirational status in the goal's description,
126
138
  or retire the goal (status: retired) to record that it no longer
127
- steers design.
139
+ steers design. A goal may also be authored retired from the start:
140
+ status retired with the rationale in its description is the
141
+ declared non-goal record, and exports render it under a Non-goals
142
+ heading (ADR 0073).
128
143
 
129
144
 
130
145
  - id: goal-no-driver
@@ -146,6 +161,9 @@ questions:
146
161
  - yarramate/core@0.1#stakeholder
147
162
  question: >-
148
163
  What pressure produces {subject.name}?
164
+ askPlain: >-
165
+ Why is "{subject.name}" a goal at all? Who or what is pushing
166
+ for it?
149
167
  materiality: >-
150
168
  A goal with no driver behind it cannot be reprioritized when the
151
169
  environment changes; it floats free of the forces that would retire
@@ -169,6 +187,9 @@ questions:
169
187
  direction: outgoing
170
188
  question: >-
171
189
  What does {subject.name} actually push on?
190
+ askPlain: >-
191
+ We say "{subject.name}" matters. What would we decide differently
192
+ because of it? If nothing, does it belong in this conversation?
172
193
  materiality: >-
173
194
  A driver that influences nothing cannot participate in any trade-off;
174
195
  it is context theatre until it points at a goal or principle.
@@ -192,6 +213,9 @@ questions:
192
213
  direction: any
193
214
  question: >-
194
215
  What does {subject.name} care about here?
216
+ askPlain: >-
217
+ What does {subject.name} actually care about in all this? What
218
+ would make them push back, and what would make them happy?
195
219
  materiality: >-
196
220
  A stakeholder with no stated concern cannot veto or endorse anything;
197
221
  their objections will arrive as surprises at review time.
@@ -215,6 +239,9 @@ questions:
215
239
  question: >-
216
240
  Nothing realizes {subject.name}. What will fulfil it — or is it
217
241
  out of scope?
242
+ askPlain: >-
243
+ Who or what is going to make "{subject.name}" happen? Or should
244
+ we agree to drop it?
218
245
  materiality: >-
219
246
  An unrealized requirement is either unplanned work hiding in plain
220
247
  sight or scope that should be explicitly declined; both change the
@@ -224,8 +251,11 @@ questions:
224
251
  Add realization from the fulfilling service, component, or
225
252
  behavior; to descope instead, retire the requirement (status:
226
253
  retired) — retirement preserves the decision on record and closes
227
- the question (ADR 0064). Delete only when the history itself is
228
- noise.
254
+ the question (ADR 0064). Descoping at inception is the same
255
+ motion: a requirement authored with status retired, rationale in
256
+ its description, is the standing non-goal record and exports
257
+ render it under a Non-goals heading (ADR 0073). Delete only when
258
+ the history itself is noise.
229
259
 
230
260
  - id: principle-unapplied
231
261
  wave: motivation
@@ -242,6 +272,9 @@ questions:
242
272
  direction: any
243
273
  question: >-
244
274
  Where does {subject.name} bite?
275
+ askPlain: >-
276
+ Where does the principle "{subject.name}" actually change how we
277
+ work? Can you point to a decision it has shaped, or would shape?
245
278
  materiality: >-
246
279
  A principle applied nowhere constrains nothing; naming what it
247
280
  influences is what makes it enforceable in review.
@@ -261,6 +294,9 @@ questions:
261
294
  - condition: isolated
262
295
  question: >-
263
296
  What does the finding {subject.name} bear on?
297
+ askPlain: >-
298
+ We recorded the finding "{subject.name}". What does it actually
299
+ tell us, and what should change because of it?
264
300
  materiality: >-
265
301
  An assessment that touches nothing changes no decision; link it to
266
302
  the driver or goal it evaluates or drop it.
@@ -284,6 +320,9 @@ questions:
284
320
  question: >-
285
321
  Has an accountable reviewer accepted {subject.name} as adequately
286
322
  stated?
323
+ askPlain: >-
324
+ Is everyone happy with how "{subject.name}" is written up? Who in
325
+ this room is willing to put their name on it as correct?
287
326
  materiality: >-
288
327
  Linkage proves the wiring exists; only a recorded judgment says the
289
328
  words are right. Without an attestation, adequacy is nobody's
@@ -311,6 +350,9 @@ questions:
311
350
  direction: outgoing
312
351
  question: >-
313
352
  Who or what consumes {subject.name}?
353
+ askPlain: >-
354
+ Who actually uses "{subject.name}"? If we cannot name anyone,
355
+ why do we offer it?
314
356
  materiality: >-
315
357
  A service with no consumer is either the system boundary stated
316
358
  implicitly, missing model detail, or scope to delete.
@@ -334,6 +376,9 @@ questions:
334
376
  predicate: yarramate/ownership/owner
335
377
  question: >-
336
378
  Who is accountable for {subject.name}?
379
+ askPlain: >-
380
+ If something goes wrong with "{subject.name}", whose desk does
381
+ it land on?
337
382
  materiality: >-
338
383
  Ownership decides who accepts changes, budgets maintenance, and
339
384
  adjudicates constraint conflicts for the subject.
@@ -357,6 +402,9 @@ questions:
357
402
  direction: outgoing
358
403
  question: >-
359
404
  What behavior is {subject.name} actually responsible for?
405
+ askPlain: >-
406
+ What does {subject.name} actually do in this picture? What work
407
+ are they on the hook for day to day?
360
408
  materiality: >-
361
409
  An actor with no assignment is either decorative or hiding an
362
410
  undeclared responsibility boundary.
@@ -381,6 +429,9 @@ questions:
381
429
  direction: any
382
430
  question: >-
383
431
  Which behavior creates and maintains {subject.name}?
432
+ askPlain: >-
433
+ Where does "{subject.name}" come from? Who creates it, and who
434
+ keeps it up to date?
384
435
  materiality: >-
385
436
  Information nothing accesses cannot be owned, persisted, or exchanged
386
437
  correctly; write responsibility determines consistency boundaries.
@@ -401,6 +452,9 @@ questions:
401
452
  - yarramate/core@0.1#technologyService
402
453
  question: >-
403
454
  What does this system offer its environment, and to whom?
455
+ askPlain: >-
456
+ In plain terms: what does this system do for people, and who are
457
+ those people?
404
458
  materiality: >-
405
459
  Declared services define the solution boundary; without them the model
406
460
  cannot say what is inside versus outside.
@@ -429,6 +483,9 @@ questions:
429
483
  - yarramate/core@0.1#outcome
430
484
  question: >-
431
485
  Which requirement or goal does {subject.name} exist to satisfy?
486
+ askPlain: >-
487
+ Why do we have "{subject.name}" at all? If we dropped it
488
+ tomorrow, which goal or promise would suffer?
432
489
  materiality: >-
433
490
  A service with no motivation link cannot be traded off against
434
491
  anything; when budgets tighten nobody can say what breaks if it
@@ -453,6 +510,9 @@ questions:
453
510
  direction: incoming
454
511
  question: >-
455
512
  What starts {subject.name}?
513
+ askPlain: >-
514
+ How does "{subject.name}" get kicked off? Does somebody start
515
+ it, or does something happen that sets it in motion?
456
516
  materiality: >-
457
517
  A process nothing triggers or performs either runs on an undeclared
458
518
  schedule or does not actually happen; both are design facts worth
@@ -484,6 +544,9 @@ questions:
484
544
  - yarramate/core@0.1#capability
485
545
  question: >-
486
546
  What actually delivers {subject.name}?
547
+ askPlain: >-
548
+ We promise "{subject.name}". Walk me through how it actually
549
+ gets delivered today, or how it will be.
487
550
  materiality: >-
488
551
  A business service with no realizing behavior or application is a
489
552
  promise with no mechanism; the gap is where delivery estimates go
@@ -965,6 +1028,37 @@ questions:
965
1028
  Add a lifecycle status claim; planned subjects should also appear in a
966
1029
  target architecture state where states are used.
967
1030
 
1031
+ - id: subjects-near-duplicate
1032
+ wave: hygiene
1033
+ since: "0.7"
1034
+ scope: subject
1035
+ subjects:
1036
+ kinds:
1037
+ - yarramate/core@0.1#capability
1038
+ - yarramate/core@0.1#businessService
1039
+ - yarramate/core@0.1#applicationService
1040
+ - yarramate/core@0.1#applicationComponent
1041
+ - yarramate/core@0.1#businessActor
1042
+ - yarramate/core@0.1#dataObject
1043
+ - yarramate/core@0.1#businessObject
1044
+ trigger:
1045
+ - condition: near-duplicate
1046
+ question: >-
1047
+ {subject.name} closely resembles {counterparts}. Is this one subject
1048
+ recorded twice, or are they genuinely different things?
1049
+ materiality: >-
1050
+ Identity is the first thing the model promises: one subject, one name,
1051
+ one place to change it. Two records for one thing silently fork every
1052
+ decision made about it, and both halves still pass check.
1053
+ authority: human
1054
+ resolution: >-
1055
+ If they are the same subject, keep one and delete or retire the other,
1056
+ moving its relationships across, and record the discarded name in the
1057
+ survivor's aka list so the old word still finds it. If they are
1058
+ genuinely different, say so in the model: add the counterpart's id to
1059
+ this subject's distinctFrom list. That answer is itself a claim, so it
1060
+ closes the question permanently and survives re-running the interview.
1061
+
968
1062
  - id: states-undefined
969
1063
  wave: hygiene
970
1064
  since: "0.1"
@@ -1,7 +1,6 @@
1
1
  import Ajv2020Module from 'ajv/dist/2020.js';
2
2
  import { diagnosticOrder, loadSourceDocument, locateSourcePath, } from './source-document.js';
3
- import adapterMappingSchema from '../schema/yarramate-adapter-mapping.schema.json' with {
4
- type: 'json'
3
+ import adapterMappingSchema from '../schema/yarramate-adapter-mapping.schema.json' with { type: 'json'
5
4
  };
6
5
  const Ajv2020 = Ajv2020Module.default;
7
6
  const validateSchema = new Ajv2020({ allErrors: true }).compile(adapterMappingSchema);