yarramate 0.7.1 → 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/catalogues/core-enrichment.yaml +284 -6
- package/dist/design-command.js +2 -0
- package/dist/interrogate-command.d.ts +2 -0
- package/dist/interrogate-command.js +4 -2
- package/package.json +1 -1
- package/schema/yarramate-design-step.schema.json +3 -0
- package/schema/yarramate-interrogation-report.schema.json +1 -0
- package/schema/yarramate-question-catalogue.schema.json +5 -0
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
format: yarramate/question-catalogue/v1
|
|
2
2
|
id: core-enrichment
|
|
3
|
-
version: "0.
|
|
3
|
+
version: "0.4"
|
|
4
4
|
profile: yarramate/core@0.1
|
|
5
5
|
presentation:
|
|
6
6
|
title: Core enrichment interview
|
|
7
7
|
description: >-
|
|
8
|
-
The guided design path: motivation, business,
|
|
9
|
-
cross-cutting hygiene
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
8
|
+
The guided design path: motivation, business, application, technology,
|
|
9
|
+
and implementation waves plus cross-cutting hygiene. Each question
|
|
10
|
+
states the decision its answer changes; a question that cannot is
|
|
11
|
+
deleted, not softened. Adequacy is enforced by linkage depth and
|
|
12
|
+
attestation, never by reading words. Versioning is additive within a
|
|
13
|
+
major version: every question records the catalogue version it arrived
|
|
14
|
+
in (ADR 0063), and a completed interview honestly reopens when the
|
|
15
|
+
path deepens.
|
|
13
16
|
|
|
14
17
|
waves:
|
|
15
18
|
- id: motivation
|
|
@@ -23,6 +26,16 @@ waves:
|
|
|
23
26
|
description: >-
|
|
24
27
|
How declared services are realized, performed, and fed with
|
|
25
28
|
information.
|
|
29
|
+
- id: technology
|
|
30
|
+
name: Technology
|
|
31
|
+
description: >-
|
|
32
|
+
Where the declared applications actually run and what materializes
|
|
33
|
+
them.
|
|
34
|
+
- id: implementation
|
|
35
|
+
name: Implementation
|
|
36
|
+
description: >-
|
|
37
|
+
How the planned architecture becomes real: work, deliverables, and
|
|
38
|
+
the plateaus between here and there.
|
|
26
39
|
- id: hygiene
|
|
27
40
|
name: Model hygiene
|
|
28
41
|
description: Cross-cutting completeness that keeps every wave honest.
|
|
@@ -31,6 +44,7 @@ questions:
|
|
|
31
44
|
# ---- motivation ----------------------------------------------------------
|
|
32
45
|
- id: outcome-missing
|
|
33
46
|
wave: motivation
|
|
47
|
+
since: "0.1"
|
|
34
48
|
scope: workspace
|
|
35
49
|
trigger:
|
|
36
50
|
- condition: no-subject-of-kind
|
|
@@ -50,6 +64,7 @@ questions:
|
|
|
50
64
|
|
|
51
65
|
- id: stakeholders-missing
|
|
52
66
|
wave: motivation
|
|
67
|
+
since: "0.1"
|
|
53
68
|
scope: workspace
|
|
54
69
|
trigger:
|
|
55
70
|
- condition: no-subject-of-kind
|
|
@@ -68,6 +83,7 @@ questions:
|
|
|
68
83
|
|
|
69
84
|
- id: constraints-missing
|
|
70
85
|
wave: motivation
|
|
86
|
+
since: "0.1"
|
|
71
87
|
scope: workspace
|
|
72
88
|
trigger:
|
|
73
89
|
- condition: no-subject-of-kind
|
|
@@ -86,6 +102,7 @@ questions:
|
|
|
86
102
|
|
|
87
103
|
- id: goal-unrealized
|
|
88
104
|
wave: motivation
|
|
105
|
+
since: "0.1"
|
|
89
106
|
scope: subject
|
|
90
107
|
subjects:
|
|
91
108
|
kinds:
|
|
@@ -110,6 +127,7 @@ questions:
|
|
|
110
127
|
|
|
111
128
|
- id: goal-no-driver
|
|
112
129
|
wave: motivation
|
|
130
|
+
since: "0.3"
|
|
113
131
|
scope: subject
|
|
114
132
|
subjects:
|
|
115
133
|
kinds:
|
|
@@ -137,6 +155,7 @@ questions:
|
|
|
137
155
|
|
|
138
156
|
- id: driver-influences-nothing
|
|
139
157
|
wave: motivation
|
|
158
|
+
since: "0.3"
|
|
140
159
|
scope: subject
|
|
141
160
|
subjects:
|
|
142
161
|
kinds:
|
|
@@ -158,6 +177,7 @@ questions:
|
|
|
158
177
|
|
|
159
178
|
- id: stakeholder-unconcerned
|
|
160
179
|
wave: motivation
|
|
180
|
+
since: "0.3"
|
|
161
181
|
scope: subject
|
|
162
182
|
subjects:
|
|
163
183
|
kinds:
|
|
@@ -180,6 +200,7 @@ questions:
|
|
|
180
200
|
|
|
181
201
|
- id: requirement-unrealized
|
|
182
202
|
wave: motivation
|
|
203
|
+
since: "0.3"
|
|
183
204
|
scope: subject
|
|
184
205
|
subjects:
|
|
185
206
|
kinds:
|
|
@@ -203,6 +224,7 @@ questions:
|
|
|
203
224
|
|
|
204
225
|
- id: principle-unapplied
|
|
205
226
|
wave: motivation
|
|
227
|
+
since: "0.3"
|
|
206
228
|
scope: subject
|
|
207
229
|
subjects:
|
|
208
230
|
kinds:
|
|
@@ -225,6 +247,7 @@ questions:
|
|
|
225
247
|
|
|
226
248
|
- id: assessment-unlinked
|
|
227
249
|
wave: motivation
|
|
250
|
+
since: "0.3"
|
|
228
251
|
scope: subject
|
|
229
252
|
subjects:
|
|
230
253
|
kinds:
|
|
@@ -243,6 +266,7 @@ questions:
|
|
|
243
266
|
|
|
244
267
|
- id: motivation-unattested
|
|
245
268
|
wave: motivation
|
|
269
|
+
since: "0.3"
|
|
246
270
|
scope: subject
|
|
247
271
|
subjects:
|
|
248
272
|
kinds:
|
|
@@ -268,6 +292,7 @@ questions:
|
|
|
268
292
|
# ---- business ------------------------------------------------------------
|
|
269
293
|
- id: service-consumer-unknown
|
|
270
294
|
wave: business
|
|
295
|
+
since: "0.1"
|
|
271
296
|
scope: subject
|
|
272
297
|
subjects:
|
|
273
298
|
kinds:
|
|
@@ -291,6 +316,7 @@ questions:
|
|
|
291
316
|
|
|
292
317
|
- id: owner-missing
|
|
293
318
|
wave: business
|
|
319
|
+
since: "0.1"
|
|
294
320
|
scope: subject
|
|
295
321
|
subjects:
|
|
296
322
|
kinds:
|
|
@@ -313,6 +339,7 @@ questions:
|
|
|
313
339
|
|
|
314
340
|
- id: actor-unassigned
|
|
315
341
|
wave: business
|
|
342
|
+
since: "0.1"
|
|
316
343
|
scope: subject
|
|
317
344
|
subjects:
|
|
318
345
|
kinds:
|
|
@@ -335,6 +362,7 @@ questions:
|
|
|
335
362
|
|
|
336
363
|
- id: information-unaccessed
|
|
337
364
|
wave: business
|
|
365
|
+
since: "0.1"
|
|
338
366
|
scope: subject
|
|
339
367
|
subjects:
|
|
340
368
|
kinds:
|
|
@@ -358,6 +386,7 @@ questions:
|
|
|
358
386
|
|
|
359
387
|
- id: no-service-declared
|
|
360
388
|
wave: business
|
|
389
|
+
since: "0.1"
|
|
361
390
|
scope: workspace
|
|
362
391
|
trigger:
|
|
363
392
|
- condition: no-subject-of-kind
|
|
@@ -378,6 +407,7 @@ questions:
|
|
|
378
407
|
|
|
379
408
|
- id: service-realizes-no-motivation
|
|
380
409
|
wave: business
|
|
410
|
+
since: "0.3"
|
|
381
411
|
scope: subject
|
|
382
412
|
subjects:
|
|
383
413
|
kinds:
|
|
@@ -405,6 +435,7 @@ questions:
|
|
|
405
435
|
|
|
406
436
|
- id: process-untriggered
|
|
407
437
|
wave: business
|
|
438
|
+
since: "0.3"
|
|
408
439
|
scope: subject
|
|
409
440
|
subjects:
|
|
410
441
|
kinds:
|
|
@@ -427,6 +458,7 @@ questions:
|
|
|
427
458
|
|
|
428
459
|
- id: business-service-unrealized
|
|
429
460
|
wave: business
|
|
461
|
+
since: "0.3"
|
|
430
462
|
scope: subject
|
|
431
463
|
subjects:
|
|
432
464
|
kinds:
|
|
@@ -460,6 +492,7 @@ questions:
|
|
|
460
492
|
# ---- application ---------------------------------------------------------
|
|
461
493
|
- id: app-service-unrealized
|
|
462
494
|
wave: application
|
|
495
|
+
since: "0.3"
|
|
463
496
|
scope: subject
|
|
464
497
|
subjects:
|
|
465
498
|
kinds:
|
|
@@ -490,6 +523,7 @@ questions:
|
|
|
490
523
|
|
|
491
524
|
- id: component-realizes-nothing
|
|
492
525
|
wave: application
|
|
526
|
+
since: "0.3"
|
|
493
527
|
scope: subject
|
|
494
528
|
subjects:
|
|
495
529
|
kinds:
|
|
@@ -515,6 +549,7 @@ questions:
|
|
|
515
549
|
|
|
516
550
|
- id: behavior-unassigned
|
|
517
551
|
wave: application
|
|
552
|
+
since: "0.3"
|
|
518
553
|
scope: subject
|
|
519
554
|
subjects:
|
|
520
555
|
kinds:
|
|
@@ -546,6 +581,7 @@ questions:
|
|
|
546
581
|
|
|
547
582
|
- id: event-triggers-nothing
|
|
548
583
|
wave: application
|
|
584
|
+
since: "0.3"
|
|
549
585
|
scope: subject
|
|
550
586
|
subjects:
|
|
551
587
|
kinds:
|
|
@@ -568,6 +604,7 @@ questions:
|
|
|
568
604
|
|
|
569
605
|
- id: information-unowned
|
|
570
606
|
wave: application
|
|
607
|
+
since: "0.3"
|
|
571
608
|
scope: subject
|
|
572
609
|
subjects:
|
|
573
610
|
kinds:
|
|
@@ -589,6 +626,7 @@ questions:
|
|
|
589
626
|
|
|
590
627
|
- id: planned-design-unattested
|
|
591
628
|
wave: application
|
|
629
|
+
since: "0.3"
|
|
592
630
|
scope: subject
|
|
593
631
|
subjects:
|
|
594
632
|
kinds:
|
|
@@ -612,9 +650,246 @@ questions:
|
|
|
612
650
|
topic "design-review" (revoke by deleting it when the design
|
|
613
651
|
changes).
|
|
614
652
|
|
|
653
|
+
# ---- technology ----------------------------------------------------------
|
|
654
|
+
- id: component-unhosted
|
|
655
|
+
wave: technology
|
|
656
|
+
since: "0.4"
|
|
657
|
+
scope: subject
|
|
658
|
+
subjects:
|
|
659
|
+
kinds:
|
|
660
|
+
- yarramate/core@0.1#applicationComponent
|
|
661
|
+
kindMatching: exact
|
|
662
|
+
statuses:
|
|
663
|
+
- planned
|
|
664
|
+
- current
|
|
665
|
+
trigger:
|
|
666
|
+
- condition: missing-linkage
|
|
667
|
+
kinds:
|
|
668
|
+
- yarramate/core@0.1#serving
|
|
669
|
+
- yarramate/core@0.1#assignment
|
|
670
|
+
direction: incoming
|
|
671
|
+
counterpartKinds:
|
|
672
|
+
- yarramate/core@0.1#node
|
|
673
|
+
- yarramate/core@0.1#device
|
|
674
|
+
- yarramate/core@0.1#systemSoftware
|
|
675
|
+
- yarramate/core@0.1#technologyService
|
|
676
|
+
question: >-
|
|
677
|
+
Where does {subject.name} run?
|
|
678
|
+
materiality: >-
|
|
679
|
+
The hosting boundary decides latency, failure domain, scaling
|
|
680
|
+
model, and data residency; a component with no declared runtime is
|
|
681
|
+
deployed by whoever gets there first. Matching is exact by intent:
|
|
682
|
+
profile-derived module kinds inherit their deployable parent's
|
|
683
|
+
hosting rather than answering separately.
|
|
684
|
+
authority: either
|
|
685
|
+
resolution: >-
|
|
686
|
+
Add the node, device, or system software that hosts it with a
|
|
687
|
+
serving or assignment relationship into the component.
|
|
688
|
+
|
|
689
|
+
- id: node-serves-nothing
|
|
690
|
+
wave: technology
|
|
691
|
+
since: "0.4"
|
|
692
|
+
scope: subject
|
|
693
|
+
subjects:
|
|
694
|
+
kinds:
|
|
695
|
+
- yarramate/core@0.1#node
|
|
696
|
+
- yarramate/core@0.1#device
|
|
697
|
+
- yarramate/core@0.1#systemSoftware
|
|
698
|
+
trigger:
|
|
699
|
+
- condition: missing-relationship
|
|
700
|
+
kinds:
|
|
701
|
+
- yarramate/core@0.1#serving
|
|
702
|
+
- yarramate/core@0.1#assignment
|
|
703
|
+
direction: outgoing
|
|
704
|
+
question: >-
|
|
705
|
+
What does {subject.name} host or serve?
|
|
706
|
+
materiality: >-
|
|
707
|
+
Declared infrastructure that serves nothing is either cost without
|
|
708
|
+
purpose or missing the links that justify it; both change the
|
|
709
|
+
deployment budget.
|
|
710
|
+
authority: either
|
|
711
|
+
resolution: >-
|
|
712
|
+
Add serving or assignment relationships to the applications and
|
|
713
|
+
behavior it hosts, or remove it.
|
|
714
|
+
|
|
715
|
+
- id: technology-service-unrealized
|
|
716
|
+
wave: technology
|
|
717
|
+
since: "0.4"
|
|
718
|
+
scope: subject
|
|
719
|
+
subjects:
|
|
720
|
+
kinds:
|
|
721
|
+
- yarramate/core@0.1#technologyService
|
|
722
|
+
statuses:
|
|
723
|
+
- planned
|
|
724
|
+
- current
|
|
725
|
+
trigger:
|
|
726
|
+
- condition: missing-linkage
|
|
727
|
+
kinds:
|
|
728
|
+
- yarramate/core@0.1#realization
|
|
729
|
+
direction: incoming
|
|
730
|
+
counterpartKinds:
|
|
731
|
+
- yarramate/core@0.1#node
|
|
732
|
+
- yarramate/core@0.1#systemSoftware
|
|
733
|
+
- yarramate/core@0.1#technologyFunction
|
|
734
|
+
- yarramate/core@0.1#technologyProcess
|
|
735
|
+
question: >-
|
|
736
|
+
What provides {subject.name}?
|
|
737
|
+
materiality: >-
|
|
738
|
+
A technology service with no realizing node or behavior is a
|
|
739
|
+
dependency assumed rather than provided; outages and upgrades have
|
|
740
|
+
no owner in the model.
|
|
741
|
+
authority: either
|
|
742
|
+
resolution: >-
|
|
743
|
+
Add realization from the node, system software, or technology
|
|
744
|
+
behavior that provides the service.
|
|
745
|
+
|
|
746
|
+
- id: artifact-unassigned
|
|
747
|
+
wave: technology
|
|
748
|
+
since: "0.4"
|
|
749
|
+
scope: subject
|
|
750
|
+
subjects:
|
|
751
|
+
kinds:
|
|
752
|
+
- yarramate/core@0.1#artifact
|
|
753
|
+
kindMatching: exact
|
|
754
|
+
trigger:
|
|
755
|
+
- condition: missing-relationship
|
|
756
|
+
kinds:
|
|
757
|
+
- yarramate/core@0.1#assignment
|
|
758
|
+
- yarramate/core@0.1#realization
|
|
759
|
+
direction: any
|
|
760
|
+
question: >-
|
|
761
|
+
What deploys {subject.name}, and what does it materialize?
|
|
762
|
+
materiality: >-
|
|
763
|
+
An artifact with no deployment target and nothing it realizes is a
|
|
764
|
+
build output the architecture cannot place; release engineering
|
|
765
|
+
starts from exactly these links.
|
|
766
|
+
authority: either
|
|
767
|
+
resolution: >-
|
|
768
|
+
Assign the artifact to the node that deploys it and add realization
|
|
769
|
+
to the component or data it materializes.
|
|
770
|
+
|
|
771
|
+
# ---- implementation ------------------------------------------------------
|
|
772
|
+
- id: workpackage-delivers-nothing
|
|
773
|
+
wave: implementation
|
|
774
|
+
since: "0.4"
|
|
775
|
+
scope: subject
|
|
776
|
+
subjects:
|
|
777
|
+
kinds:
|
|
778
|
+
- yarramate/core@0.1#workPackage
|
|
779
|
+
trigger:
|
|
780
|
+
- condition: missing-relationship
|
|
781
|
+
kinds:
|
|
782
|
+
- yarramate/core@0.1#realization
|
|
783
|
+
- yarramate/core@0.1#aggregation
|
|
784
|
+
direction: outgoing
|
|
785
|
+
question: >-
|
|
786
|
+
What does {subject.name} produce?
|
|
787
|
+
materiality: >-
|
|
788
|
+
Work with no deliverable cannot be accepted or declared done; the
|
|
789
|
+
deliverable link is what makes progress reviewable rather than
|
|
790
|
+
reported.
|
|
791
|
+
authority: either
|
|
792
|
+
resolution: >-
|
|
793
|
+
Add realization from the work package to its deliverables.
|
|
794
|
+
|
|
795
|
+
- id: workpackage-unassigned
|
|
796
|
+
wave: implementation
|
|
797
|
+
since: "0.4"
|
|
798
|
+
scope: subject
|
|
799
|
+
subjects:
|
|
800
|
+
kinds:
|
|
801
|
+
- yarramate/core@0.1#workPackage
|
|
802
|
+
trigger:
|
|
803
|
+
- condition: missing-linkage
|
|
804
|
+
kinds:
|
|
805
|
+
- yarramate/core@0.1#assignment
|
|
806
|
+
direction: incoming
|
|
807
|
+
counterpartKinds:
|
|
808
|
+
- yarramate/core@0.1#businessActor
|
|
809
|
+
- yarramate/core@0.1#businessRole
|
|
810
|
+
question: >-
|
|
811
|
+
Who is committed to {subject.name}?
|
|
812
|
+
materiality: >-
|
|
813
|
+
An unassigned work package is a plan without capacity; commitment
|
|
814
|
+
is the difference between a roadmap and a wish list.
|
|
815
|
+
authority: human
|
|
816
|
+
resolution: >-
|
|
817
|
+
Add assignment from the actor or role that owns the work.
|
|
818
|
+
|
|
819
|
+
- id: deliverable-realizes-nothing
|
|
820
|
+
wave: implementation
|
|
821
|
+
since: "0.4"
|
|
822
|
+
scope: subject
|
|
823
|
+
subjects:
|
|
824
|
+
kinds:
|
|
825
|
+
- yarramate/core@0.1#deliverable
|
|
826
|
+
kindMatching: exact
|
|
827
|
+
trigger:
|
|
828
|
+
- condition: missing-relationship
|
|
829
|
+
kinds:
|
|
830
|
+
- yarramate/core@0.1#realization
|
|
831
|
+
direction: outgoing
|
|
832
|
+
question: >-
|
|
833
|
+
What does {subject.name} make real?
|
|
834
|
+
materiality: >-
|
|
835
|
+
A deliverable that realizes no architecture element is effort
|
|
836
|
+
disconnected from the design; its acceptance criteria cannot be
|
|
837
|
+
stated architecturally.
|
|
838
|
+
authority: either
|
|
839
|
+
resolution: >-
|
|
840
|
+
Add realization from the deliverable to the plateau, requirement,
|
|
841
|
+
or element it brings into being.
|
|
842
|
+
|
|
843
|
+
- id: plateau-aggregates-nothing
|
|
844
|
+
wave: implementation
|
|
845
|
+
since: "0.4"
|
|
846
|
+
scope: subject
|
|
847
|
+
subjects:
|
|
848
|
+
kinds:
|
|
849
|
+
- yarramate/core@0.1#plateau
|
|
850
|
+
trigger:
|
|
851
|
+
- condition: missing-relationship
|
|
852
|
+
kinds:
|
|
853
|
+
- yarramate/core@0.1#aggregation
|
|
854
|
+
- yarramate/core@0.1#composition
|
|
855
|
+
direction: outgoing
|
|
856
|
+
question: >-
|
|
857
|
+
Which architecture does {subject.name} stabilize?
|
|
858
|
+
materiality: >-
|
|
859
|
+
A plateau that aggregates nothing describes no state anyone can
|
|
860
|
+
stand on; migration planning needs to know what is stable when.
|
|
861
|
+
authority: either
|
|
862
|
+
resolution: >-
|
|
863
|
+
Aggregate the elements that are current during this plateau, or use
|
|
864
|
+
architecture states instead and remove it.
|
|
865
|
+
|
|
866
|
+
- id: gap-unaddressed
|
|
867
|
+
wave: implementation
|
|
868
|
+
since: "0.4"
|
|
869
|
+
scope: subject
|
|
870
|
+
subjects:
|
|
871
|
+
kinds:
|
|
872
|
+
- yarramate/core@0.1#gap
|
|
873
|
+
trigger:
|
|
874
|
+
- condition: missing-relationship
|
|
875
|
+
kinds:
|
|
876
|
+
- yarramate/core@0.1#association
|
|
877
|
+
- yarramate/core@0.1#realization
|
|
878
|
+
direction: any
|
|
879
|
+
question: >-
|
|
880
|
+
What closes {subject.name}?
|
|
881
|
+
materiality: >-
|
|
882
|
+
A named gap nothing addresses is a known risk with no plan; either
|
|
883
|
+
work closes it or the acceptance of it should be on record.
|
|
884
|
+
authority: human
|
|
885
|
+
resolution: >-
|
|
886
|
+
Associate the gap with the plateaus it separates and the
|
|
887
|
+
deliverable that closes it, or record the decision to accept it.
|
|
888
|
+
|
|
615
889
|
# ---- hygiene -------------------------------------------------------------
|
|
616
890
|
- id: concept-isolated
|
|
617
891
|
wave: hygiene
|
|
892
|
+
since: "0.1"
|
|
618
893
|
scope: subject
|
|
619
894
|
subjects:
|
|
620
895
|
kinds:
|
|
@@ -640,6 +915,7 @@ questions:
|
|
|
640
915
|
|
|
641
916
|
- id: concept-undescribed
|
|
642
917
|
wave: hygiene
|
|
918
|
+
since: "0.1"
|
|
643
919
|
scope: subject
|
|
644
920
|
subjects:
|
|
645
921
|
kinds:
|
|
@@ -663,6 +939,7 @@ questions:
|
|
|
663
939
|
|
|
664
940
|
- id: status-missing
|
|
665
941
|
wave: hygiene
|
|
942
|
+
since: "0.1"
|
|
666
943
|
scope: subject
|
|
667
944
|
subjects:
|
|
668
945
|
kinds:
|
|
@@ -685,6 +962,7 @@ questions:
|
|
|
685
962
|
|
|
686
963
|
- id: states-undefined
|
|
687
964
|
wave: hygiene
|
|
965
|
+
since: "0.1"
|
|
688
966
|
scope: workspace
|
|
689
967
|
trigger:
|
|
690
968
|
- condition: no-state-defined
|
package/dist/design-command.js
CHANGED
|
@@ -33,6 +33,7 @@ const selectStep = (report, subjectFilter) => {
|
|
|
33
33
|
question: question.question,
|
|
34
34
|
materiality: question.materiality,
|
|
35
35
|
resolution: question.resolution,
|
|
36
|
+
...(question.since === undefined ? {} : { since: question.since }),
|
|
36
37
|
};
|
|
37
38
|
}
|
|
38
39
|
const subjects = subjectFilter === undefined
|
|
@@ -49,6 +50,7 @@ const selectStep = (report, subjectFilter) => {
|
|
|
49
50
|
question: first.question,
|
|
50
51
|
materiality: question.materiality,
|
|
51
52
|
resolution: question.resolution,
|
|
53
|
+
...(question.since === undefined ? {} : { since: question.since }),
|
|
52
54
|
subject: {
|
|
53
55
|
id: first.id,
|
|
54
56
|
...(first.name === undefined ? {} : { name: first.name }),
|
|
@@ -44,6 +44,7 @@ export interface CatalogueQuestion {
|
|
|
44
44
|
readonly materiality: string;
|
|
45
45
|
readonly resolution: string;
|
|
46
46
|
readonly authority: 'human' | 'agent' | 'either';
|
|
47
|
+
readonly since?: string;
|
|
47
48
|
}
|
|
48
49
|
export interface QuestionCatalogue {
|
|
49
50
|
readonly format: 'yarramate/question-catalogue/v1';
|
|
@@ -74,6 +75,7 @@ interface ReportQuestion {
|
|
|
74
75
|
readonly question: string;
|
|
75
76
|
readonly materiality: string;
|
|
76
77
|
readonly resolution: string;
|
|
78
|
+
readonly since?: string;
|
|
77
79
|
readonly subjects?: readonly OpenSubject[];
|
|
78
80
|
}
|
|
79
81
|
export interface InterrogationReport {
|
|
@@ -175,6 +175,7 @@ export function evaluateCatalogue(catalogue, graph, profileContext) {
|
|
|
175
175
|
question: question.question.trim(),
|
|
176
176
|
materiality: question.materiality.trim(),
|
|
177
177
|
resolution: question.resolution.trim(),
|
|
178
|
+
...(question.since === undefined ? {} : { since: question.since }),
|
|
178
179
|
};
|
|
179
180
|
if (question.scope === 'workspace') {
|
|
180
181
|
const isOpen = question.trigger.every((condition) => conditionHolds(index, condition, undefined, profileContext));
|
|
@@ -253,12 +254,13 @@ export function renderInterrogationReport(report) {
|
|
|
253
254
|
lines.push(` closed ${question.id}`);
|
|
254
255
|
continue;
|
|
255
256
|
}
|
|
257
|
+
const sinceMarker = question.since === undefined ? '' : ` [since ${question.since}]`;
|
|
256
258
|
if (question.subjects === undefined) {
|
|
257
|
-
lines.push(` OPEN ${question.id} — ${question.question}`);
|
|
259
|
+
lines.push(` OPEN ${question.id}${sinceMarker} — ${question.question}`);
|
|
258
260
|
lines.push(` why: ${question.materiality}`);
|
|
259
261
|
continue;
|
|
260
262
|
}
|
|
261
|
-
lines.push(` OPEN ${question.id} (${question.subjects.length} ${question.subjects.length === 1 ? 'subject' : 'subjects'})`);
|
|
263
|
+
lines.push(` OPEN ${question.id}${sinceMarker} (${question.subjects.length} ${question.subjects.length === 1 ? 'subject' : 'subjects'})`);
|
|
262
264
|
for (const subject of question.subjects) {
|
|
263
265
|
lines.push(` ask: "${subject.question}" [authority: ${question.authority}]`);
|
|
264
266
|
}
|
package/package.json
CHANGED
|
@@ -392,6 +392,11 @@
|
|
|
392
392
|
"resolution": {
|
|
393
393
|
"description": "Guidance for how an accepted answer should land as native authoring (which claim, relationship, or state to add).",
|
|
394
394
|
"$ref": "#/$defs/nonEmptyText"
|
|
395
|
+
},
|
|
396
|
+
"since": {
|
|
397
|
+
"description": "The catalogue version this question first appeared in. Lets consumers distinguish 'the catalogue deepened' from 'the model regressed' when a completed interview reopens (ADR 0063).",
|
|
398
|
+
"type": "string",
|
|
399
|
+
"pattern": "^[0-9]+\\.[0-9]+$"
|
|
395
400
|
}
|
|
396
401
|
},
|
|
397
402
|
"allOf": [
|