@knowledge-bus/opencode 0.5.0 → 0.8.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.
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@knowledge-bus/opencode",
3
- "version": "0.5.0",
3
+ "version": "0.8.0",
4
4
  "private": false,
5
- "description": "Knowledge Bus workflows for OpenCode",
5
+ "description": "Define, inspect, and check Knowledge Bus expectations in OpenCode",
6
6
  "license": "MIT",
7
7
  "type": "module",
8
8
  "main": "./index.js",
@@ -18,11 +18,15 @@ Requires [uv](https://docs.astral.sh/uv/) and Python matching `requires_python`
18
18
  ```sh
19
19
  python3 /absolute/runtime/kbp.py --validate /absolute/target/.knowledge-bus/
20
20
  python3 /absolute/runtime/kbp.py --mint element 1 /absolute/target/.knowledge-bus/
21
+ python3 /absolute/runtime/kbp.py --inspect /absolute/target/.knowledge-bus/
22
+ python3 /absolute/runtime/kbp.py --explore --output /absolute/output /absolute/target/.knowledge-bus/
21
23
  ```
22
24
 
23
- The bundled wheel supplies the checker and protocol. Its pinned dependency can be downloaded on first use. The launcher keeps its cache outside the installation and preserves the caller's working directory and failure exit code. If a prerequisite is missing, report it; do not install tools without permission.
25
+ The bundled wheel supplies the checker, protocol, and required Python code. The launcher uses bundled files without registry access, keeps its cache outside the installation, and preserves the caller's working directory and failure exit code. If a prerequisite is missing, report it; do not install tools without permission.
24
26
 
25
- Supply an absolute target when the shell is not in the user's folder. Checking never initializes a folder. `KNOWLEDGE_BUS_CACHE_DIR` optionally selects another external cache location.
27
+ Supply an absolute universe file, knowledge-base folder, or its `.knowledge-bus/` folder when the shell is elsewhere. Checking never initializes a folder. `.knowledge-bus/` is the reserved Knowledge Bus configuration directory, not the knowledge base itself. `KNOWLEDGE_BUS_CACHE_DIR` optionally selects another cache location.
28
+
29
+ `--inspect` prints an Explorer model and writes nothing. When the scope contains several universes, select one with `--universe`. `--explore` requires an output directory and refuses existing output unless `--replace` is supplied. It builds an offline Explorer from the bundled viewer.
26
30
 
27
31
  ## References
28
32
 
@@ -32,4 +36,4 @@ The references directory containing this guide includes `knowledge-bus-protocol.
32
36
 
33
37
  The checker first checks that its protocol is sound. It checks definitions and guidance for required fields, code collisions, references, version compatibility, and permitted structures. Include the universe when checking its guidance.
34
38
 
35
- Each failure names the offending declaration or reference. Explain the change it calls for. A passing result does not establish that a question is useful or that an answer is true. Answers and ingestion logs still require human review.
39
+ Each failure names the offending declaration or reference. Explain how to correct the reported problem. Report conformance and Explorer renderability separately. A passing result does not establish that a question is useful or that an answer is true. Answers and ingestion logs still require human review.
@@ -10,8 +10,14 @@ my-folder/
10
10
  └── .knowledge-bus/
11
11
  ├── universe.kbp.yaml
12
12
  ├── type-guidance.kbp.yaml # optional
13
+ ├── marks.explorer.yaml # optional presentation declarations
13
14
  ├── answers.yaml # when recording answers
14
- └── ingest-log.md # when ingesting existing material
15
+ ├── ingest-log.md # when ingesting existing material
16
+ └── explorer/ # optional generated read-only projection
17
+ └── <universe-id>/
18
+ ├── index.html
19
+ ├── model.json
20
+ └── receipt.json
15
21
  ```
16
22
 
17
23
  Any folder can contain a `.knowledge-bus/` directory. Git is not required. Define the structure before creating documents, or derive it from existing material through ingestion. Answers and an ingest log are not prerequisites for authoring a universe.
@@ -28,7 +34,26 @@ kbp --validate path/to/universe.kbp.yaml path/to/type-guidance.kbp.yaml
28
34
 
29
35
  Without an explicit target, the checker searches the current folder and then its parents for `.knowledge-bus/`. It uses the first one found and does not combine definitions from different directories. Calls from inside `.knowledge-bus/` use that directory. An empty or incomplete nearer directory does not fall back to a parent's `.knowledge-bus/`.
30
36
 
31
- The selected Knowledge Bus directory supplies its directly contained `*.kbp.yaml` files together, so guidance can resolve its universe. Answers and logs are not checker inputs. Explicit file targets select exactly those files; include the universe when checking guidance.
37
+ The checker reads the `*.kbp.yaml` files directly inside the selected `.knowledge-bus/` directory together, so it can check guidance against its universe. Duplicate universe ids fail. Answers, logs, presentation marks, and Explorer outputs are not checker inputs. Explicit file targets select exactly those files; include the universe when checking guidance.
38
+
39
+ ## Several Universes in One Scope
40
+
41
+ Several universes may be direct siblings in one `.knowledge-bus/`. Prefix filenames for people, but rely on semantic headers for identity and association:
42
+
43
+ ```text
44
+ .knowledge-bus/
45
+ ├── product-development.universe.kbp.yaml
46
+ ├── product-development.type-guidance.kbp.yaml
47
+ ├── product-development.marks.explorer.yaml
48
+ ├── team-operations.universe.kbp.yaml
49
+ ├── team-operations.type-guidance.kbp.yaml
50
+ ├── team-operations.marks.explorer.yaml
51
+ └── explorer/
52
+ ├── product-development/{index.html,model.json,receipt.json}
53
+ └── team-operations/{index.html,model.json,receipt.json}
54
+ ```
55
+
56
+ `universe.id` identifies a universe. `guidance.guides` and `marks.marks_for` associate its companion files. When the directory contains several universes, inspection requires an id or universe file. Duplicate ids and ambiguous companion files fail. Generated Explorers stay under their universe ids. Nested `.knowledge-bus/` directories remain separate.
32
57
 
33
58
  A generic directory target without its own `.knowledge-bus/` still scans for `*.kbp.yaml` files, for example a reference collection or test corpus. It skips metadata directories and nested folders that contain their own `.knowledge-bus/`. Directory scans do not follow nested directory symlinks.
34
59
 
@@ -1,7 +1,7 @@
1
1
  protocol:
2
2
  id: kbp
3
3
  name: Knowledge Bus Protocol
4
- version: 0.5
4
+ version: 0.7
5
5
  status: draft
6
6
  purpose: >
7
7
  The structured exchange of contextual knowledge rather than data. Defines what a
@@ -95,6 +95,24 @@ declarations:
95
95
  scope: >
96
96
  A predicate in a universe names frames only. A factor id is legal in a guidance
97
97
  entry's `when` and nowhere else.
98
+ evaluation:
99
+ result: true | false | unknown
100
+ rules:
101
+ - Named dimensions and named facets are combined with AND.
102
+ - Values in each predicate list are alternatives combined with OR.
103
+ - An empty predicate is true; an empty alternatives list is false.
104
+ - >
105
+ Missing context is unknown, not false. AND is false if any operand is
106
+ false, true if all are true, and unknown otherwise.
107
+ - >
108
+ Context supplies one resolved value per dimension or facet at the scope
109
+ being evaluated. Consumers MUST NOT guess a missing value, merge distinct
110
+ outcome-components, or substitute an artifact's placement for an element's
111
+ ordering value. Evaluate each applicable scope separately.
112
+ - >
113
+ Invalid locally enumerated values and undeclared facets are errors, not
114
+ unknown. Source-backed values require resolution against their registry;
115
+ lack of that resolution leaves the affected context unknown.
98
116
 
99
117
  universe:
100
118
  document:
@@ -200,7 +218,27 @@ declarations:
200
218
  relation_kind:
201
219
  id: "<kind-id>"
202
220
  ordered: true | false
221
+ phrasing:
222
+ forward: "<plain-text phrase>"
223
+ reverse: "<plain-text phrase>"
203
224
  required: [id, ordered]
225
+ rules:
226
+ - ordered MUST be a boolean.
227
+ - >
228
+ phrasing is optional. When present it MUST be a mapping with exactly
229
+ forward for an unordered kind, or exactly forward and reverse for an
230
+ ordered kind. Each value MUST be a nonblank string.
231
+ - >
232
+ For an edge from A to B, forward reads A / phrase / B and reverse reads
233
+ B / phrase / A. An unordered kind uses forward from either endpoint.
234
+ Consumers choose the phrase by the displayed subject, not by selection
235
+ state. Phrases are plain text, without template interpretation or inferred
236
+ grammatical changes; endpoint names remain separate display components.
237
+ - >
238
+ Phrasing does not change the relation's meaning, direction or restrictions.
239
+ Shared kind contracts still apply. Without phrasing, consumers retain
240
+ shared explanations where defined and MUST NOT invent inverse wording for
241
+ custom kinds.
204
242
 
205
243
  guidance:
206
244
  document:
@@ -284,13 +322,41 @@ composition:
284
322
 
285
323
  rules:
286
324
  - An element appears at most once per artifact.
325
+ - An explicit entry strength MUST agree with its containing composition list.
287
326
  - Exactly one artifact owns a given element instance; others link to the owner.
288
327
  - Strength MAY be conditional on a frame predicate.
328
+ - >
329
+ On a core entry, when controls requiredness: true means core, false means
330
+ situationally available, and unknown means unresolved requiredness. A false
331
+ strength predicate does not exclude the element or require a second entry.
332
+ - >
333
+ On a situational entry, when controls situational availability: true means
334
+ available, false means excluded, and unknown means unresolved availability.
335
+ With no when, the entry has its containing list's strength and is available,
336
+ subject to the independent applicability rules below.
289
337
  - A universe MAY disable an artifact type entirely under a frame predicate.
290
338
  - >
291
339
  A universe MUST be able to return the empty composition. Where no frame value
292
340
  warrants structure, the conforming answer is no artifact.
293
341
 
342
+ evaluation:
343
+ precedence:
344
+ - >
345
+ Evaluate artifact disabled_when and universe empty_composition.when first.
346
+ A true disabled_when returns disabled; otherwise a true empty predicate
347
+ returns empty. Either definite outcome suppresses all members, even when
348
+ the other predicate is unknown. If neither is true and either is unknown,
349
+ the artifact result is unresolved, not an asserted usable composition.
350
+ - >
351
+ For an applicable artifact, evaluate each element gate at its applicable
352
+ scope. A false gate excludes the member regardless of strength; an unknown
353
+ gate leaves applicability unresolved. An absent gate allows the member.
354
+ - >
355
+ Apply the entry's strength/availability rule only to applicable members.
356
+ Preserve unresolved members as unresolved rather than silently discarding
357
+ or promoting them. These results describe requirements and availability;
358
+ they do not assert that instances exist or that the action is ready.
359
+
294
360
  ordering:
295
361
  declared_by: universe
296
362
  attaches_to: element
@@ -301,6 +367,29 @@ composition:
301
367
 
302
368
  relations:
303
369
 
370
+ kind_contracts:
371
+ scope: >
372
+ Universes still declare their kinds. The following ids have shared meanings
373
+ in this protocol version and MUST use the stated ordered value. Other ids
374
+ remain universe-defined; consumers MUST NOT infer a shared meaning from
375
+ their names. These contracts do not generate extra edges.
376
+ distinct-from:
377
+ ordered: false
378
+ meaning: >
379
+ The definitions answer different questions or enable different actions and
380
+ must not be substituted for one another. The distinction is symmetric.
381
+ limits: >
382
+ Not transitive. Does not imply opposites, disjoint contents or disjoint
383
+ instances. Different ids alone do not warrant emitting an edge.
384
+ feeds:
385
+ ordered: true
386
+ meaning: Knowledge from the source can inform the target.
387
+ limits: >
388
+ Source to recipient. Does not imply mandatory sequence, causation, proof,
389
+ ownership, copying or actual instance provenance. A feeds B and B feeds C
390
+ do not entail A feeds C. Gate, legality and freeze restrictions remain
391
+ attached and MUST NOT be lost when displaying or aggregating connections.
392
+
304
393
  edge:
305
394
  from: "<element-id | artifact-id>"
306
395
  to: "<element-id | artifact-id>"
@@ -1,8 +1,8 @@
1
1
  guidance:
2
2
  id: product-development-guidance
3
3
  label: Product development — type guidance
4
- version: 0.5
5
- conforms_to: kbp/0.5
4
+ version: 0.7
5
+ conforms_to: kbp/0.7
6
6
  guides: product-development
7
7
 
8
8
  guidance_kinds:
@@ -143,8 +143,8 @@ sources:
143
143
  url: "https://github.com/google-labs-code/design.md/blob/main/docs/spec.md"
144
144
  checked: 2026-08-18
145
145
  dtcg:
146
- cite: "Design Tokens Community Group — Design Tokens Format Module 2025.10, a draft marked 'Do not implement this version'"
147
- url: "https://www.designtokens.org/TR/drafts/format/"
146
+ cite: "Design Tokens Community Group — Design Tokens Format Module 2025.10, published version"
147
+ url: "https://www.designtokens.org/TR/2025.10/format/"
148
148
  checked: 2026-08-18
149
149
  hig:
150
150
  cite: "Apple — Human Interface Guidelines, the Foundations topic list. Client-rendered; read through a headless browser"
@@ -178,7 +178,7 @@ sources:
178
178
  cite: "GitLab Pajamas — a standing public brand guideline set"
179
179
  url: "https://design.gitlab.com/"
180
180
  scenario-walkthrough:
181
- cite: "Alan Cooper et al. — About Face, on the key path scenario"
181
+ cite: "Gardenia Durian — How to write a useful scenario walkthrough (Pivotal Labs, 2016)"
182
182
  url: "https://medium.com/product-labs/how-to-write-a-useful-scenario-walkthrough-f48bf40b1b69"
183
183
  adr:
184
184
  cite: "Michael Nygard — Documenting Architecture Decisions (2011); templates at adr.github.io"
@@ -336,7 +336,7 @@ elements:
336
336
  - { kind: convention, source: outcome,
337
337
  claim: "The name stays singular: an effort steers by a scope-named product outcome — a behavioural measure within its own influence that drives the star — and sets its success criteria on that." }
338
338
  - { kind: convention, source: omtm,
339
- claim: "The stage-scoped One Metric That Matters is the same move under another name — team- and period-scoped, complementing a durable star rather than competing with it." }
339
+ claim: "A North Star tracks customer value within its framework. The One Metric That Matters identifies the current metric to focus on and may change with the business stage or bottleneck; the names are not interchangeable." }
340
340
  - { kind: convention, source: ns-checklist,
341
341
  claim: "Represents vision and strategy without being either — a strong metric statement lets a reader recover both at a high level." }
342
342
  - { kind: pitfall, source: asserted,
@@ -369,8 +369,8 @@ elements:
369
369
  claim: "'Improve X' invites post-hoc rationalisation. Set a threshold and a measurement date." }
370
370
  - { kind: heuristic, source: asserted,
371
371
  claim: "What a PRD loosely calls a launch's success metrics is this element. A key result is this element wearing OKR vocabulary — a time-boxed threshold, typically on an input metric." }
372
- - { kind: convention, source: cascade,
373
- claim: "The initiative inherits its space's star and guardrails by reference and authors its own commitments. The reference cascades; the goals do not." }
372
+ - { kind: heuristic, source: asserted,
373
+ claim: "KB recommendation: inherit shared metrics by reference and state local commitments explicitly." }
374
374
 
375
375
  market-sizing:
376
376
  - { kind: heuristic, source: asserted,
@@ -434,7 +434,7 @@ elements:
434
434
 
435
435
  risks-and-assumptions:
436
436
  - { kind: heuristic, source: asserted,
437
- claim: "An assumption is believed true but unvalidated; a risk could go wrong. Each gets impact times likelihood and a response — mitigate, accept, watch." }
437
+ claim: "For an assumption, state what is being relied on and how it will be checked. For a risk, state what could happen, its significance, and the response." }
438
438
  - { kind: convention, source: premortem,
439
439
  claim: "Pre-mortem sorting — real tigers versus paper tigers — resists both alarmism and optimism." }
440
440
  - { kind: convention, source: rust-rfc,
@@ -498,9 +498,9 @@ elements:
498
498
 
499
499
  alternatives-considered:
500
500
  - { kind: convention, source: rust-rfc,
501
- claim: "Standard in RFCs, decision documents and decision records. This element holds the roads not taken." }
502
- - { kind: boundary, source: adr,
503
- claim: "The winner lives in Decision. Folding the chosen option in here structurally breaks that element." }
501
+ claim: "Standard in RFCs, decision documents and decision records. Describe the options considered, including the chosen option." }
502
+ - { kind: boundary, source: madr,
503
+ claim: "Describe and compare the options here, including the chosen option. Decision records the commitment and why it was chosen." }
504
504
  - { kind: convention, source: y-statement,
505
505
  claim: "Naming the rejected options is grammatically obligatory in the Y-statement form — 'and neglected …' — not an optional courtesy to the reader." }
506
506
  - { kind: convention, source: spade,
@@ -540,19 +540,19 @@ elements:
540
540
  - { kind: boundary, source: asserted,
541
541
  claim: "Distinct from Risks & Assumptions: a consequence is accepted and expected, a risk is uncertain. Filing a known cost as a risk hides that someone chose it." }
542
542
  - { kind: empty, source: asserted,
543
- claim: "Honestly empty means the option genuinely dominated on every criterion — rare enough that it is worth saying so explicitly." }
543
+ claim: "An option can outperform every alternative and still have consequences. Distinguish none identified from not assessed; neither follows from the option dominating the comparison." }
544
544
 
545
545
  reversal-condition:
546
546
  - { kind: heuristic, source: asserted,
547
547
  claim: "An observable condition, not a review date: what would have to be seen for this to stop holding. 'Revisit in six months' is a calendar entry; 'if median latency exceeds the budget for two consecutive quarters' is a condition." }
548
- - { kind: convention, source: madr,
549
- claim: "Where the decision can be checked mechanically, name the check — a fitness function, a test, a review step — so that compliance is observable rather than assumed." }
548
+ - { kind: boundary, source: asserted,
549
+ claim: "Checking that a decision was implemented and deciding whether it should change are different activities. Implementation compliance is not itself a condition for reconsideration." }
550
550
  - { kind: convention, source: azure-waf,
551
- claim: "A decision taken at low confidence should say so, because recorded low confidence is what makes later reconsideration legitimate rather than second-guessing." }
551
+ claim: "Record uncertainty that may warrant revisiting the decision. New evidence or changed circumstances can justify reconsideration regardless of its original confidence." }
552
552
  - { kind: boundary, source: asserted,
553
553
  claim: "Distinct from Risks & Assumptions: a failing assumption is one trigger among several. A better alternative appearing, a constraint lifting, or an authority changing reopen the decision without any assumption having failed." }
554
554
  - { kind: empty, source: asserted,
555
- claim: "Honestly empty means nothing observable would reopen it — which is a strong claim about an irreversible commitment, and should read as one." }
555
+ claim: "State what would warrant reconsideration. If no trigger has been identified, say so; this does not establish that the commitment is irreversible." }
556
556
 
557
557
  prior-art:
558
558
  - { kind: convention, source: rust-rfc,
@@ -606,7 +606,7 @@ elements:
606
606
  - { kind: heuristic, source: asserted,
607
607
  claim: "The element holds the model, not the instances. Bulk enumeration beyond what makes the model legible is product content, not documentation." }
608
608
  - { kind: heuristic, source: asserted,
609
- claim: "Takes its host's phase — behaviour-defining sets in a design document, schema-bound catalogues in an architecture overview. Promoted to a standalone document it would fail the one-phase rule." }
609
+ claim: "Canonical Model is assigned to Architecture in this universe. Referencing it from another artifact does not change its phase." }
610
610
 
611
611
  artifacts:
612
612
 
@@ -650,7 +650,7 @@ artifacts:
650
650
  - { kind: boundary, source: asserted,
651
651
  claim: "The brand book's strategy half — values, personality, purpose — belongs to Product Vision and Positioning Statement by the split rule. This type takes only the rules for expressing it, visual and verbal alike." }
652
652
  - { kind: convention, source: design-md,
653
- claim: "A machine-readable form of this type now exists, written for whoever renders the identity — a person or a coding agent alike. It carries the visual rules and no writing rules." }
653
+ claim: "DESIGN.md represents visual design-system rules. It can supply the visual portion of a brand guide; it does not represent its verbal rules." }
654
654
  - { kind: pitfall, source: asserted,
655
655
  claim: "Instructions for revising the document are not part of the document. That is a process, and it belongs wherever the process is owned." }
656
656
  - { kind: refresh, source: asserted,
@@ -658,7 +658,7 @@ artifacts:
658
658
 
659
659
  scenario-walkthrough:
660
660
  - { kind: convention, source: scenario-walkthrough,
661
- claim: "The key path scenario walks the primary pathways as user actions with product responses, deliberately concrete where a context scenario stays high-level." }
661
+ claim: "A useful scenario walkthrough follows a person pursuing a goal. It can help a team determine what the product should do early, without prescribing detailed interface design." }
662
662
  - { kind: pitfall, source: asserted,
663
663
  claim: "Distinct from three unrelated walkthroughs: the live usability exercise, ATAM's quality-attribute review, and the inspection meeting." }
664
664
 
@@ -672,7 +672,7 @@ artifacts:
672
672
 
673
673
  system-context-diagram:
674
674
  - { kind: convention, source: c4,
675
- claim: "C4 level 1 exactly. Component detail inside it is the split signal toward the Architecture Overview." }
675
+ claim: "Show people and external systems at C4 level 1. Use the Architecture Overview for internal containers and their interactions at level 2. C4 component-level detail is a further level." }
676
676
 
677
677
  decision-brief:
678
678
  - { kind: convention, source: daci,
@@ -708,4 +708,4 @@ artifacts:
708
708
  - { kind: boundary, source: adr-boundary,
709
709
  claim: "A decision record that grows into a design guide has stopped being a decision record." }
710
710
  - { kind: refresh, source: asserted,
711
- claim: "It goes stale when its reversal condition is met, not on a schedule — and a record whose reversal condition can no longer be evaluated is already stale." }
711
+ claim: "Reassess the decision when a reconsideration trigger occurs or its supporting circumstances change. If a trigger cannot be evaluated, establish what evidence is missing. If the decision changes, create a superseding record and retain the original." }
@@ -1,8 +1,8 @@
1
1
  universe:
2
2
  id: product-development
3
3
  label: Product development
4
- version: 0.5
5
- conforms_to: kbp/0.5
4
+ version: 0.8
5
+ conforms_to: kbp/0.7
6
6
  ordering_frame: phase
7
7
  overview:
8
8
  covers: >
@@ -93,14 +93,44 @@ empty_composition:
93
93
  when: { time-separation: [none], reversibility: [reversible] }
94
94
 
95
95
  relation_kinds:
96
- - { id: presupposes, ordered: true }
97
- - { id: distinct-from, ordered: false }
98
- - { id: counterweight-to, ordered: false }
99
- - { id: feeds, ordered: true }
100
- - { id: split-signal, ordered: true }
101
- - { id: descendant-of, ordered: true }
102
- - { id: requires, ordered: true }
103
- - { id: nests-under, ordered: true }
96
+ - id: presupposes
97
+ ordered: true
98
+ phrasing:
99
+ forward: Context from
100
+ reverse: Context for
101
+ - id: distinct-from
102
+ ordered: false
103
+ phrasing:
104
+ forward: Not interchangeable with
105
+ - id: counterweight-to
106
+ ordered: false
107
+ phrasing:
108
+ forward: Balances
109
+ - id: feeds
110
+ ordered: true
111
+ phrasing:
112
+ forward: Can inform
113
+ reverse: Can be informed by
114
+ - id: split-signal
115
+ ordered: true
116
+ phrasing:
117
+ forward: May need detail moved to
118
+ reverse: May receive detail moved from
119
+ - id: descendant-of
120
+ ordered: true
121
+ phrasing:
122
+ forward: Adapted from
123
+ reverse: Adapted into
124
+ - id: requires
125
+ ordered: true
126
+ phrasing:
127
+ forward: Needs
128
+ reverse: Needed by
129
+ - id: nests-under
130
+ ordered: true
131
+ phrasing:
132
+ forward: Within the scope of
133
+ reverse: Broader scope for
104
134
 
105
135
  elements:
106
136
 
@@ -172,7 +202,7 @@ artifacts:
172
202
  disabled_when: { uptake: [given] }
173
203
  composition:
174
204
  core: [product-vision, customer-segments, value-proposition, cost-structure, trade-offs,
175
- north-star-metric, growth-mechanism, capabilities, unfair-advantage]
205
+ { element: north-star-metric, mode: links }, growth-mechanism, capabilities, unfair-advantage]
176
206
  situational: [positioning-statement, input-metrics, revenue-streams, case-for-change]
177
207
 
178
208
  - id: business-model-canvas
@@ -202,7 +232,7 @@ artifacts:
202
232
  disabled_when: { uptake: [given, chosen] }
203
233
  composition:
204
234
  core: [product-vision, customer-segments, value-proposition, cost-structure, trade-offs,
205
- north-star-metric, growth-mechanism, capabilities, unfair-advantage, revenue-streams]
235
+ { element: north-star-metric, mode: links }, growth-mechanism, capabilities, unfair-advantage, revenue-streams]
206
236
  situational: [positioning-statement, input-metrics]
207
237
 
208
238
  - id: swot-analysis
@@ -353,15 +383,6 @@ artifacts:
353
383
  - { element: decision-criteria, mode: links, when: { authority: [approve, statutory] } }
354
384
  situational: [constraints, prior-art, open-questions]
355
385
 
356
- - id: working-note
357
- code: axh9h
358
- enablement: { action: "resume your own work after a gap without re-deriving it", actor: the author at a later time, timing: across sessions }
359
- alias: { kind: none, reason: no-aligned-form }
360
- disabled_when: { time-separation: [none] }
361
- composition:
362
- core: [constraints, scope-in-out, open-questions]
363
- situational: [trade-offs, as-built-survey, success-criteria]
364
-
365
386
  relations:
366
387
 
367
388
  - { from: value-proposition, to: case-for-change, kind: distinct-from }
@@ -392,8 +413,8 @@ relations:
392
413
  - { from: north-star-metric, to: input-metrics, kind: requires }
393
414
  - { from: guardrail-health-metrics, to: input-metrics, kind: counterweight-to }
394
415
  - { from: measurement-protocol, to: hypothesis, kind: presupposes }
395
- - { from: external-opportunities-threats, to: macro-environment-factors, kind: feeds }
396
- - { from: external-opportunities-threats, to: competitor-profile, kind: feeds }
416
+ - { from: macro-environment-factors, to: external-opportunities-threats, kind: feeds }
417
+ - { from: competitor-profile, to: external-opportunities-threats, kind: feeds }
397
418
  - { from: as-built-survey, to: sequence-and-foreclosure, kind: feeds }
398
419
  - { from: stepwise-trace, to: data-flows-and-integrations, kind: split-signal }
399
420
  - { from: product-vision, to: product-vision, kind: nests-under, legality: permitted }