rcf-lite 0.32.4 → 0.33.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 (90) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/fixtures/canary-manifest.json +9 -9
  3. package/guidance/discovery/README.md +22 -0
  4. package/guidance/discovery/discovery-viewer-command-page-1-layout.html +191 -0
  5. package/guidance/discovery/discovery-viewer-command-page-2-coverage.html +193 -0
  6. package/guidance/discovery/discovery-viewer-command-page-3-trace-matrix.html +195 -0
  7. package/guidance/discovery/discovery-viewer-command-page-4-tables.html +196 -0
  8. package/guidance/discovery/discovery-viewer-command-page-5-subtabs.html +224 -0
  9. package/guidance/discovery/discovery-viewer-command-page-6-one-page.html +280 -0
  10. package/guidance/discovery/discovery-viewer-command-page.md +301 -0
  11. package/package.json +1 -1
  12. package/rcf/adrs/adr-4139-readiness-tables-read-only-no-commands.json +30 -0
  13. package/rcf/adrs/adr-4140-view-query-routes-per-pivot-matrix-no-mermaid.json +30 -0
  14. package/rcf/adrs/adr-4141-verify-modes.json +25 -0
  15. package/rcf/code-nodes/cn-771.json +3 -2
  16. package/rcf/code-nodes/cn-779.json +19 -0
  17. package/rcf/code-nodes/cn-780.json +14 -0
  18. package/rcf/code-nodes/cn-781.json +14 -0
  19. package/rcf/code-nodes/cn-782.json +15 -0
  20. package/rcf/code-nodes/cn-783.json +17 -0
  21. package/rcf/code-nodes/cn-784.json +20 -0
  22. package/rcf/code-nodes/cn-785.json +14 -0
  23. package/rcf/code-nodes/cn-786.json +14 -0
  24. package/rcf/code-nodes/cn-787.json +18 -0
  25. package/rcf/code-nodes/cn-788.json +14 -0
  26. package/rcf/code-nodes/cn-789.json +14 -0
  27. package/rcf/code-nodes/cn-790.json +15 -0
  28. package/rcf/code-nodes/cn-791.json +14 -0
  29. package/rcf/code-nodes/cn-792.json +17 -0
  30. package/rcf/code-nodes/cn-793.json +17 -0
  31. package/rcf/code-nodes/cn-794.json +18 -0
  32. package/rcf/code-nodes/cn-795.json +15 -0
  33. package/rcf/code-nodes/cn-796.json +14 -0
  34. package/rcf/code-nodes/cn-797.json +14 -0
  35. package/rcf/code-nodes/cn-798.json +14 -0
  36. package/rcf/define/brief-ledger.json +47 -0
  37. package/rcf/define/decisions-ledger.json +113 -0
  38. package/rcf/fbs/fbs-204.json +46 -0
  39. package/rcf/fbs/fbs-205.json +46 -0
  40. package/rcf/fbs/fbs-206.json +49 -0
  41. package/rcf/fbs/fbs-207.json +43 -0
  42. package/rcf/fbs/fbs-208.json +47 -0
  43. package/rcf/fbs/fbs-209.json +22 -0
  44. package/rcf/requirements/req-002.json +5 -2
  45. package/rcf/requirements/req-180.json +6 -3
  46. package/rcf/tacs/tac-4127-readiness-view.json +2 -2
  47. package/rcf/tacs/tac-4133-readiness-po-layer.json +2 -2
  48. package/rcf/tacs/tac-4135-readiness-command-page.json +94 -0
  49. package/rcf/tacs/tac-4136-view-query-routes.json +68 -0
  50. package/rcf/tacs/tac-4141-verify-modes.json +25 -0
  51. package/rcf/test-suites/ts-223.json +7 -7
  52. package/rcf/test-suites/ts-237.json +78 -0
  53. package/rcf/test-suites/ts-238.json +70 -0
  54. package/rcf/test-suites/ts-239.json +78 -0
  55. package/rcf/test-suites/ts-240.json +70 -0
  56. package/rcf/test-suites/ts-241.json +70 -0
  57. package/rcf/test-suites/ts-242.json +46 -0
  58. package/rcf/user-stories/us-16503.json +51 -0
  59. package/rcf/user-stories/us-18001.json +4 -4
  60. package/rcf/user-stories/us-18003.json +79 -0
  61. package/rcf/user-stories/us-18004.json +70 -0
  62. package/rcf/user-stories/us-18005.json +79 -0
  63. package/rcf/user-stories/us-208.json +74 -0
  64. package/rcf/user-stories/us-209.json +70 -0
  65. package/releases/releases.yaml +18 -1
  66. package/src/cli/finalise.js +141 -2
  67. package/src/cli/view.js +13 -1
  68. package/src/define/ledgers.js +9 -1
  69. package/src/finalise/spawn.js +2 -0
  70. package/src/server/index.js +104 -39
  71. package/src/server/routes.js +169 -0
  72. package/src/verify/cli/run.js +40 -0
  73. package/src/verify/engine/deterministic.js +150 -0
  74. package/src/verify/engine/index.js +27 -4
  75. package/src/view/doc-renderers/req.js +11 -9
  76. package/src/view/html-page.js +15 -11
  77. package/src/view/index.js +7 -1
  78. package/src/view/live-client.js +4 -0
  79. package/src/view/page-init.js +842 -1
  80. package/src/view/readiness/composite-id.js +35 -0
  81. package/src/view/readiness/coverage-summary.js +293 -0
  82. package/src/view/readiness/delta-counts.js +156 -0
  83. package/src/view/readiness/grid.js +175 -0
  84. package/src/view/readiness/po-layer.js +110 -220
  85. package/src/view/readiness/tables.js +500 -0
  86. package/src/view/readiness/thin-reqs.js +237 -0
  87. package/src/view/readiness/trace-matrix.js +392 -0
  88. package/src/view/readiness.js +359 -370
  89. package/src/view/style.css +594 -0
  90. package/src/watch/index.js +75 -17
@@ -0,0 +1,195 @@
1
+ <!doctype html>
2
+ <html lang="en-GB">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>Discovery sketch: 3-trace-matrix</title>
7
+ <style>
8
+ <!-- F7-note: these --sv-* hex tokens are the LIGHT-mode palette only; the dark-mode block lives in src/view/style.css under html[data-theme="dark"] (and its auto variant) and is covered pair-by-pair by test/view/contrast-aa.test.js. The sketches set color-scheme: light to keep OS dark-mode from re-inking them; the viewer runtime switches tokens by data-theme, not by color-scheme. -->
9
+ :root {
10
+ --sv-canvas: #F6F8FC; --sv-surface: #FFFFFF; --sv-raised: #EEF2F8; --sv-ink: #111927;
11
+ --sv-muted: #536176; --sv-border: #D8DFEA; --sv-control: #738198; --sv-link: #2447EB;
12
+ --sv-hover: #1737C7; --sv-active: #E9EEFF; --sv-button: #2447EB; --sv-onbutton: #FFFFFF;
13
+ --sv-code: #EEF2F8; --sv-success: #116B4D; --sv-successbg: #E7F4ED; --sv-warning: #895000;
14
+ --sv-warningbg: #FFF3DC; --sv-danger: #B4233B; --sv-dangerbg: #FDECF0; --sv-focus: #2447EB;
15
+ --sv-font: Arial, Helvetica, sans-serif;
16
+ --sv-mono: ui-monospace, SFMono-Regular, Consolas, "Liberation Mono", monospace;
17
+ }
18
+ * { box-sizing: border-box; }
19
+ body { background: var(--sv-canvas); color: var(--sv-ink); font-family: var(--sv-font); margin: 0; }
20
+ main { max-width: 1100px; margin: 0 auto; padding: 36px 16px 24px; }
21
+ .intro { font-size: 18px; line-height: 1.55; max-width: 960px; margin: 0 0 24px; }
22
+ a { color: var(--sv-link); text-decoration: none; }
23
+ a:hover { color: var(--sv-hover); text-decoration: underline; }
24
+ a:focus-visible, button:focus-visible { outline: 2px solid var(--sv-focus); outline-offset: 3px; }
25
+ .panel { background: var(--sv-surface); border: 1px solid var(--sv-border); border-radius: 8px; overflow: hidden; }
26
+ .pivot { display: flex; align-items: center; flex-wrap: wrap; gap: 12px; padding: 22px 24px; border-bottom: 1px solid var(--sv-border); }
27
+ .pivot-title { margin: 0; font-size: 19px; font-weight: 600; }
28
+ .chip { background: var(--sv-code); border: 1px solid var(--sv-border); border-radius: 5px; padding: 8px 10px; font: 600 13px var(--sv-mono); }
29
+ .actions { margin-left: auto; display: flex; gap: 8px; flex-wrap: wrap; }
30
+ button { font: 600 12px var(--sv-font); padding: 9px 13px; border: 1px solid var(--sv-control); border-radius: 5px; color: var(--sv-ink); background: var(--sv-surface); cursor: default; }
31
+ button.primary { background: var(--sv-button); border-color: var(--sv-button); color: var(--sv-onbutton); }
32
+ .matrix-wrap { padding: 0 20px; }
33
+ table { width: 100%; border-collapse: collapse; table-layout: fixed; font-size: 12px; }
34
+ caption { caption-side: top; text-align: left; padding: 22px 0 16px; font-size: 13px; color: var(--sv-muted); }
35
+ col.node-col { width: 14%; }
36
+ col.label-col { width: 19%; }
37
+ col.trace-col { width: 5.8%; }
38
+ col.note-col { width: 14.8%; }
39
+ th, td { border-bottom: 1px solid var(--sv-border); }
40
+ thead th { color: var(--sv-muted); font-weight: 600; }
41
+ thead tr.groups th { text-align: center; padding: 11px 3px; background: var(--sv-raised); font-size: 11px; border-right: 1px solid var(--sv-border); }
42
+ thead tr.groups th:first-child, thead tr.groups th:nth-child(2), thead tr.groups th:last-child { text-align: left; padding-left: 8px; }
43
+ thead tr.columns th { height: 128px; padding: 12px 0; vertical-align: bottom; }
44
+ .column-id { display: inline-block; writing-mode: vertical-rl; transform: rotate(180deg); font: 11px var(--sv-mono); letter-spacing: .02em; }
45
+ tbody th, tbody td { padding: 12px 3px; vertical-align: middle; }
46
+ tbody td[data-column] { text-align: center; }
47
+ .node { text-align: left; padding-left: 7px; font: 11px var(--sv-mono); overflow-wrap: anywhere; }
48
+ .criterion .node { padding-left: 17px; }
49
+ .label { line-height: 1.45; padding-right: 10px; }
50
+ .story { background: var(--sv-active); }
51
+ .story .label { font-weight: 600; }
52
+ .story .node { font-weight: 700; }
53
+ .note { font-size: 11px; line-height: 1.45; padding-left: 9px; overflow-wrap: anywhere; }
54
+ .danger { color: var(--sv-danger); }
55
+ .warning { color: var(--sv-warning); }
56
+ .mark { display: inline-block; width: 20px; height: 20px; vertical-align: middle; border-radius: 3px; position: relative; }
57
+ .resolved { background: var(--sv-success); }
58
+ .resolved::after { content: ""; position: absolute; width: 8px; height: 4px; border-left: 2px solid var(--sv-onbutton); border-bottom: 2px solid var(--sv-onbutton); transform: rotate(-45deg); left: 5px; top: 6px; }
59
+ .unresolved { background: var(--sv-warning); }
60
+ .unresolved::after { content: "!"; color: var(--sv-onbutton); font: bold 15px var(--sv-font); position: absolute; inset: 1px 0 0; text-align: center; }
61
+ .reached { background: var(--sv-raised); border: 1px solid var(--sv-border); }
62
+ .legend { display: flex; flex-wrap: wrap; gap: 14px 24px; list-style: none; margin: 0; padding: 20px 24px; border-bottom: 1px solid var(--sv-border); color: var(--sv-muted); font-size: 12px; }
63
+ .legend li { display: flex; gap: 8px; align-items: center; }
64
+ .legend .empty { border: 1px dashed var(--sv-border); }
65
+ .explanation { padding: 20px 24px 23px; }
66
+ .explanation h2 { margin: 0 0 9px; font-size: 14px; }
67
+ .explanation p { margin: 0; color: var(--sv-muted); font-size: 13px; line-height: 1.65; max-width: 860px; }
68
+ .data { margin: 18px 2px 0; font-size: 12px; color: var(--sv-muted); line-height: 1.7; overflow-wrap: anywhere; }
69
+ code { font-family: var(--sv-mono); font-size: .95em; }
70
+ footer { margin-top: 24px; padding-top: 16px; border-top: 1px solid var(--sv-border); color: var(--sv-muted); font-size: 11px; line-height: 1.6; }
71
+ .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; border: 0; }
72
+ @media (max-width: 719px) {
73
+ main { padding-top: 24px; }
74
+ .intro { font-size: 16px; }
75
+ .pivot { padding: 18px 16px; }
76
+ .pivot-title { font-size: 17px; }
77
+ .actions { width: 100%; margin-left: 0; }
78
+ .matrix-wrap { padding: 0 12px; }
79
+ table, tbody { display: block; }
80
+ colgroup { display: none; }
81
+ caption { display: block; line-height: 1.5; padding: 18px 3px 12px; }
82
+ thead { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); }
83
+ tbody tr { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); padding: 12px 5px; border-bottom: 1px solid var(--sv-border); gap: 10px 3px; }
84
+ tbody th, tbody td { border: 0; padding: 0; }
85
+ .node, .criterion .node { grid-column: 1 / -1; padding: 0; font-size: 12px; }
86
+ .criterion .node::before { content: "↳ "; color: var(--sv-muted); }
87
+ .label { grid-column: 1 / -1; padding: 0 0 3px; }
88
+ tbody td[data-column] { display: flex; flex-direction: column; align-items: center; gap: 5px; padding: 4px 0; }
89
+ tbody td[data-column]::before { content: attr(data-column); font: 9px var(--sv-mono); color: var(--sv-muted); }
90
+ .note { grid-column: 1 / -1; padding: 0; }
91
+ .note:has(.sr-only) { display: none; }
92
+ .legend { display: grid; grid-template-columns: 1fr; padding: 18px 16px; }
93
+ .explanation { padding: 18px 16px; }
94
+ }
95
+ </style>
96
+ </head>
97
+ <body>
98
+ <main>
99
+ <p class="intro">The Trace tab follows one requirement through its stories and checks to tests, build plans and components, showing which links reach a test that can be found.</p>
100
+ <section class="panel" aria-label="Trace matrix for requirement REQ-001">
101
+ <div class="pivot">
102
+ <span class="chip">REQ-001</span>
103
+ <h1 class="pivot-title">Readiness verdict</h1>
104
+ <button type="button" title="Opens the lookup modal to change the pivot">Change pivot</button>
105
+ <div class="actions" aria-label="Mock trace actions">
106
+ <button class="primary" type="button" title="#tab=trace&amp;id=REQ-001&amp;direction=forward">Trace</button>
107
+ <button type="button" title="#tab=trace&amp;id=REQ-001&amp;direction=reverse">Impact</button>
108
+ </div>
109
+ </div>
110
+ <div class="matrix-wrap">
111
+ <table aria-describedby="matrix-legend">
112
+ <caption>Forward trace from REQ-001, 10 rows (2 stories and 8 criteria)</caption>
113
+ <colgroup><col class="node-col"><col class="label-col"><col class="trace-col" span="9"><col class="note-col"></colgroup>
114
+ <thead>
115
+ <tr class="groups"><th rowspan="2" scope="col">Node id</th><th rowspan="2" scope="col">Short label</th><th colspan="5" scope="colgroup">Test suites and cases</th><th colspan="2" scope="colgroup">Build specs</th><th colspan="2" scope="colgroup">Components</th><th rowspan="2" scope="col">Notes</th></tr>
116
+ <tr class="columns"><th scope="col" id="col-TS-001-a"><span class="column-id">TS-001-a</span></th><th scope="col" id="col-TC-001-a-1"><span class="column-id">TC-001-a-1</span></th><th scope="col" id="col-TC-001-a-2"><span class="column-id">TC-001-a-2</span></th><th scope="col" id="col-TC-001-a-3"><span class="column-id">TC-001-a-3</span></th><th scope="col" id="col-TC-001-a-4"><span class="column-id">TC-001-a-4</span></th><th scope="col" id="col-BS-001-a"><span class="column-id">BS-001-a</span></th><th scope="col" id="col-BS-001-b"><span class="column-id">BS-001-b</span></th><th scope="col" id="col-TAC-4001"><span class="column-id">TAC-4001</span></th><th scope="col" id="col-TAC-4012"><span class="column-id">TAC-4012</span></th></tr>
117
+ </thead>
118
+ <tbody><tr class="story">
119
+ <th scope="row" id="row-US-001-1" class="node"><a href="#" title="#tab=requirements&amp;entity=US-001-1">US-001-1</a></th>
120
+ <td class="label">Operator sees readiness</td>
121
+ <td headers="row-US-001-1 col-TS-001-a" data-column="TS-001-a" title="US-001-1 / TS-001-a: Resolving test reached"><span class="mark resolved" role="img" aria-label="Resolving test reached"></span></td><td headers="row-US-001-1 col-TC-001-a-1" data-column="TC-001-a-1" title="US-001-1 / TC-001-a-1: Resolving test reached"><span class="mark resolved" role="img" aria-label="Resolving test reached"></span></td><td headers="row-US-001-1 col-TC-001-a-2" data-column="TC-001-a-2" title="US-001-1 / TC-001-a-2: Resolving test reached"><span class="mark resolved" role="img" aria-label="Resolving test reached"></span></td><td headers="row-US-001-1 col-TC-001-a-3" data-column="TC-001-a-3" title="US-001-1 / TC-001-a-3: Resolving test reached"><span class="mark resolved" role="img" aria-label="Resolving test reached"></span></td><td headers="row-US-001-1 col-TC-001-a-4" data-column="TC-001-a-4" title="US-001-1 / TC-001-a-4: Resolving test reached"><span class="mark resolved" role="img" aria-label="Resolving test reached"></span></td><td headers="row-US-001-1 col-BS-001-a" data-column="BS-001-a" title="US-001-1 / BS-001-a: Reached without test semantics"><span class="mark reached" role="img" aria-label="Reached without test semantics"></span></td><td headers="row-US-001-1 col-BS-001-b" data-column="BS-001-b" title="US-001-1 / BS-001-b: Reached without test semantics"><span class="mark reached" role="img" aria-label="Reached without test semantics"></span></td><td headers="row-US-001-1 col-TAC-4001" data-column="TAC-4001" title="US-001-1 / TAC-4001: Reached without test semantics"><span class="mark reached" role="img" aria-label="Reached without test semantics"></span></td><td headers="row-US-001-1 col-TAC-4012" data-column="TAC-4012" title="US-001-1 / TAC-4012: Reached without test semantics"><span class="mark reached" role="img" aria-label="Reached without test semantics"></span></td>
122
+ <td class="note "><span class="sr-only">No issue noted</span></td>
123
+ </tr>
124
+ <tr class="criterion">
125
+ <th scope="row" id="row-AC-001-1-1" class="node"><a href="#" title="#tab=requirements&amp;entity=AC-001-1-1">AC-001-1-1</a></th>
126
+ <td class="label">Show the verdict</td>
127
+ <td headers="row-AC-001-1-1 col-TS-001-a" data-column="TS-001-a" title="AC-001-1-1 / TS-001-a: Resolving test reached"><span class="mark resolved" role="img" aria-label="Resolving test reached"></span></td><td headers="row-AC-001-1-1 col-TC-001-a-1" data-column="TC-001-a-1" title="AC-001-1-1 / TC-001-a-1: Resolving test reached"><span class="mark resolved" role="img" aria-label="Resolving test reached"></span></td><td headers="row-AC-001-1-1 col-TC-001-a-2" data-column="TC-001-a-2" title="AC-001-1-1 / TC-001-a-2: Not reached"><span class="mark empty" role="img" aria-label="Not reached"></span></td><td headers="row-AC-001-1-1 col-TC-001-a-3" data-column="TC-001-a-3" title="AC-001-1-1 / TC-001-a-3: Not reached"><span class="mark empty" role="img" aria-label="Not reached"></span></td><td headers="row-AC-001-1-1 col-TC-001-a-4" data-column="TC-001-a-4" title="AC-001-1-1 / TC-001-a-4: Not reached"><span class="mark empty" role="img" aria-label="Not reached"></span></td><td headers="row-AC-001-1-1 col-BS-001-a" data-column="BS-001-a" title="AC-001-1-1 / BS-001-a: Reached without test semantics"><span class="mark reached" role="img" aria-label="Reached without test semantics"></span></td><td headers="row-AC-001-1-1 col-BS-001-b" data-column="BS-001-b" title="AC-001-1-1 / BS-001-b: Reached without test semantics"><span class="mark reached" role="img" aria-label="Reached without test semantics"></span></td><td headers="row-AC-001-1-1 col-TAC-4001" data-column="TAC-4001" title="AC-001-1-1 / TAC-4001: Reached without test semantics"><span class="mark reached" role="img" aria-label="Reached without test semantics"></span></td><td headers="row-AC-001-1-1 col-TAC-4012" data-column="TAC-4012" title="AC-001-1-1 / TAC-4012: Reached without test semantics"><span class="mark reached" role="img" aria-label="Reached without test semantics"></span></td>
128
+ <td class="note "><span class="sr-only">No issue noted</span></td>
129
+ </tr>
130
+ <tr class="criterion">
131
+ <th scope="row" id="row-AC-001-1-2" class="node"><a href="#" title="#tab=requirements&amp;entity=AC-001-1-2">AC-001-1-2</a></th>
132
+ <td class="label">Count open questions</td>
133
+ <td headers="row-AC-001-1-2 col-TS-001-a" data-column="TS-001-a" title="AC-001-1-2 / TS-001-a: Resolving test reached"><span class="mark resolved" role="img" aria-label="Resolving test reached"></span></td><td headers="row-AC-001-1-2 col-TC-001-a-1" data-column="TC-001-a-1" title="AC-001-1-2 / TC-001-a-1: Not reached"><span class="mark empty" role="img" aria-label="Not reached"></span></td><td headers="row-AC-001-1-2 col-TC-001-a-2" data-column="TC-001-a-2" title="AC-001-1-2 / TC-001-a-2: Resolving test reached"><span class="mark resolved" role="img" aria-label="Resolving test reached"></span></td><td headers="row-AC-001-1-2 col-TC-001-a-3" data-column="TC-001-a-3" title="AC-001-1-2 / TC-001-a-3: Not reached"><span class="mark empty" role="img" aria-label="Not reached"></span></td><td headers="row-AC-001-1-2 col-TC-001-a-4" data-column="TC-001-a-4" title="AC-001-1-2 / TC-001-a-4: Not reached"><span class="mark empty" role="img" aria-label="Not reached"></span></td><td headers="row-AC-001-1-2 col-BS-001-a" data-column="BS-001-a" title="AC-001-1-2 / BS-001-a: Reached without test semantics"><span class="mark reached" role="img" aria-label="Reached without test semantics"></span></td><td headers="row-AC-001-1-2 col-BS-001-b" data-column="BS-001-b" title="AC-001-1-2 / BS-001-b: Reached without test semantics"><span class="mark reached" role="img" aria-label="Reached without test semantics"></span></td><td headers="row-AC-001-1-2 col-TAC-4001" data-column="TAC-4001" title="AC-001-1-2 / TAC-4001: Reached without test semantics"><span class="mark reached" role="img" aria-label="Reached without test semantics"></span></td><td headers="row-AC-001-1-2 col-TAC-4012" data-column="TAC-4012" title="AC-001-1-2 / TAC-4012: Reached without test semantics"><span class="mark reached" role="img" aria-label="Reached without test semantics"></span></td>
134
+ <td class="note "><span class="sr-only">No issue noted</span></td>
135
+ </tr>
136
+ <tr class="criterion">
137
+ <th scope="row" id="row-AC-001-1-3" class="node"><a href="#" title="#tab=requirements&amp;entity=AC-001-1-3">AC-001-1-3</a></th>
138
+ <td class="label">Link to questions</td>
139
+ <td headers="row-AC-001-1-3 col-TS-001-a" data-column="TS-001-a" title="AC-001-1-3 / TS-001-a: Resolving test reached"><span class="mark resolved" role="img" aria-label="Resolving test reached"></span></td><td headers="row-AC-001-1-3 col-TC-001-a-1" data-column="TC-001-a-1" title="AC-001-1-3 / TC-001-a-1: Not reached"><span class="mark empty" role="img" aria-label="Not reached"></span></td><td headers="row-AC-001-1-3 col-TC-001-a-2" data-column="TC-001-a-2" title="AC-001-1-3 / TC-001-a-2: Not reached"><span class="mark empty" role="img" aria-label="Not reached"></span></td><td headers="row-AC-001-1-3 col-TC-001-a-3" data-column="TC-001-a-3" title="AC-001-1-3 / TC-001-a-3: Resolving test reached"><span class="mark resolved" role="img" aria-label="Resolving test reached"></span></td><td headers="row-AC-001-1-3 col-TC-001-a-4" data-column="TC-001-a-4" title="AC-001-1-3 / TC-001-a-4: Not reached"><span class="mark empty" role="img" aria-label="Not reached"></span></td><td headers="row-AC-001-1-3 col-BS-001-a" data-column="BS-001-a" title="AC-001-1-3 / BS-001-a: Reached without test semantics"><span class="mark reached" role="img" aria-label="Reached without test semantics"></span></td><td headers="row-AC-001-1-3 col-BS-001-b" data-column="BS-001-b" title="AC-001-1-3 / BS-001-b: Reached without test semantics"><span class="mark reached" role="img" aria-label="Reached without test semantics"></span></td><td headers="row-AC-001-1-3 col-TAC-4001" data-column="TAC-4001" title="AC-001-1-3 / TAC-4001: Reached without test semantics"><span class="mark reached" role="img" aria-label="Reached without test semantics"></span></td><td headers="row-AC-001-1-3 col-TAC-4012" data-column="TAC-4012" title="AC-001-1-3 / TAC-4012: Reached without test semantics"><span class="mark reached" role="img" aria-label="Reached without test semantics"></span></td>
140
+ <td class="note "><span class="sr-only">No issue noted</span></td>
141
+ </tr>
142
+ <tr class="criterion">
143
+ <th scope="row" id="row-AC-001-1-4" class="node"><a href="#" title="#tab=requirements&amp;entity=AC-001-1-4">AC-001-1-4</a></th>
144
+ <td class="label">Name the next step</td>
145
+ <td headers="row-AC-001-1-4 col-TS-001-a" data-column="TS-001-a" title="AC-001-1-4 / TS-001-a: Resolving test reached"><span class="mark resolved" role="img" aria-label="Resolving test reached"></span></td><td headers="row-AC-001-1-4 col-TC-001-a-1" data-column="TC-001-a-1" title="AC-001-1-4 / TC-001-a-1: Not reached"><span class="mark empty" role="img" aria-label="Not reached"></span></td><td headers="row-AC-001-1-4 col-TC-001-a-2" data-column="TC-001-a-2" title="AC-001-1-4 / TC-001-a-2: Not reached"><span class="mark empty" role="img" aria-label="Not reached"></span></td><td headers="row-AC-001-1-4 col-TC-001-a-3" data-column="TC-001-a-3" title="AC-001-1-4 / TC-001-a-3: Not reached"><span class="mark empty" role="img" aria-label="Not reached"></span></td><td headers="row-AC-001-1-4 col-TC-001-a-4" data-column="TC-001-a-4" title="AC-001-1-4 / TC-001-a-4: Resolving test reached"><span class="mark resolved" role="img" aria-label="Resolving test reached"></span></td><td headers="row-AC-001-1-4 col-BS-001-a" data-column="BS-001-a" title="AC-001-1-4 / BS-001-a: Reached without test semantics"><span class="mark reached" role="img" aria-label="Reached without test semantics"></span></td><td headers="row-AC-001-1-4 col-BS-001-b" data-column="BS-001-b" title="AC-001-1-4 / BS-001-b: Reached without test semantics"><span class="mark reached" role="img" aria-label="Reached without test semantics"></span></td><td headers="row-AC-001-1-4 col-TAC-4001" data-column="TAC-4001" title="AC-001-1-4 / TAC-4001: Reached without test semantics"><span class="mark reached" role="img" aria-label="Reached without test semantics"></span></td><td headers="row-AC-001-1-4 col-TAC-4012" data-column="TAC-4012" title="AC-001-1-4 / TAC-4012: Reached without test semantics"><span class="mark reached" role="img" aria-label="Reached without test semantics"></span></td>
146
+ <td class="note "><span class="sr-only">No issue noted</span></td>
147
+ </tr>
148
+ <tr class="story">
149
+ <th scope="row" id="row-US-001-2" class="node"><a href="#" title="#tab=requirements&amp;entity=US-001-2">US-001-2</a></th>
150
+ <td class="label">Engineer sees blocking items</td>
151
+ <td headers="row-US-001-2 col-TS-001-a" data-column="TS-001-a" title="US-001-2 / TS-001-a: Resolving test reached"><span class="mark resolved" role="img" aria-label="Resolving test reached"></span></td><td headers="row-US-001-2 col-TC-001-a-1" data-column="TC-001-a-1" title="US-001-2 / TC-001-a-1: Resolving test reached"><span class="mark resolved" role="img" aria-label="Resolving test reached"></span></td><td headers="row-US-001-2 col-TC-001-a-2" data-column="TC-001-a-2" title="US-001-2 / TC-001-a-2: Resolving test reached"><span class="mark resolved" role="img" aria-label="Resolving test reached"></span></td><td headers="row-US-001-2 col-TC-001-a-3" data-column="TC-001-a-3" title="US-001-2 / TC-001-a-3: Test reached; pointer unresolved"><span class="mark unresolved" role="img" aria-label="Test reached; pointer unresolved"></span></td><td headers="row-US-001-2 col-TC-001-a-4" data-column="TC-001-a-4" title="US-001-2 / TC-001-a-4: Test reached; pointer unresolved"><span class="mark unresolved" role="img" aria-label="Test reached; pointer unresolved"></span></td><td headers="row-US-001-2 col-BS-001-a" data-column="BS-001-a" title="US-001-2 / BS-001-a: Reached without test semantics"><span class="mark reached" role="img" aria-label="Reached without test semantics"></span></td><td headers="row-US-001-2 col-BS-001-b" data-column="BS-001-b" title="US-001-2 / BS-001-b: Reached without test semantics"><span class="mark reached" role="img" aria-label="Reached without test semantics"></span></td><td headers="row-US-001-2 col-TAC-4001" data-column="TAC-4001" title="US-001-2 / TAC-4001: Reached without test semantics"><span class="mark reached" role="img" aria-label="Reached without test semantics"></span></td><td headers="row-US-001-2 col-TAC-4012" data-column="TAC-4012" title="US-001-2 / TAC-4012: Reached without test semantics"><span class="mark reached" role="img" aria-label="Reached without test semantics"></span></td>
152
+ <td class="note "><span class="sr-only">No issue noted</span></td>
153
+ </tr>
154
+ <tr class="criterion">
155
+ <th scope="row" id="row-AC-001-2-1" class="node"><a href="#" title="#tab=requirements&amp;entity=AC-001-2-1">AC-001-2-1</a></th>
156
+ <td class="label">List blocking items</td>
157
+ <td headers="row-AC-001-2-1 col-TS-001-a" data-column="TS-001-a" title="AC-001-2-1 / TS-001-a: Resolving test reached"><span class="mark resolved" role="img" aria-label="Resolving test reached"></span></td><td headers="row-AC-001-2-1 col-TC-001-a-1" data-column="TC-001-a-1" title="AC-001-2-1 / TC-001-a-1: Resolving test reached"><span class="mark resolved" role="img" aria-label="Resolving test reached"></span></td><td headers="row-AC-001-2-1 col-TC-001-a-2" data-column="TC-001-a-2" title="AC-001-2-1 / TC-001-a-2: Not reached"><span class="mark empty" role="img" aria-label="Not reached"></span></td><td headers="row-AC-001-2-1 col-TC-001-a-3" data-column="TC-001-a-3" title="AC-001-2-1 / TC-001-a-3: Not reached"><span class="mark empty" role="img" aria-label="Not reached"></span></td><td headers="row-AC-001-2-1 col-TC-001-a-4" data-column="TC-001-a-4" title="AC-001-2-1 / TC-001-a-4: Not reached"><span class="mark empty" role="img" aria-label="Not reached"></span></td><td headers="row-AC-001-2-1 col-BS-001-a" data-column="BS-001-a" title="AC-001-2-1 / BS-001-a: Reached without test semantics"><span class="mark reached" role="img" aria-label="Reached without test semantics"></span></td><td headers="row-AC-001-2-1 col-BS-001-b" data-column="BS-001-b" title="AC-001-2-1 / BS-001-b: Reached without test semantics"><span class="mark reached" role="img" aria-label="Reached without test semantics"></span></td><td headers="row-AC-001-2-1 col-TAC-4001" data-column="TAC-4001" title="AC-001-2-1 / TAC-4001: Reached without test semantics"><span class="mark reached" role="img" aria-label="Reached without test semantics"></span></td><td headers="row-AC-001-2-1 col-TAC-4012" data-column="TAC-4012" title="AC-001-2-1 / TAC-4012: Reached without test semantics"><span class="mark reached" role="img" aria-label="Reached without test semantics"></span></td>
158
+ <td class="note "><span class="sr-only">No issue noted</span></td>
159
+ </tr>
160
+ <tr class="criterion">
161
+ <th scope="row" id="row-AC-001-2-2" class="node"><a href="#" title="#tab=requirements&amp;entity=AC-001-2-2">AC-001-2-2</a></th>
162
+ <td class="label">Show the failed check</td>
163
+ <td headers="row-AC-001-2-2 col-TS-001-a" data-column="TS-001-a" title="AC-001-2-2 / TS-001-a: Resolving test reached"><span class="mark resolved" role="img" aria-label="Resolving test reached"></span></td><td headers="row-AC-001-2-2 col-TC-001-a-1" data-column="TC-001-a-1" title="AC-001-2-2 / TC-001-a-1: Not reached"><span class="mark empty" role="img" aria-label="Not reached"></span></td><td headers="row-AC-001-2-2 col-TC-001-a-2" data-column="TC-001-a-2" title="AC-001-2-2 / TC-001-a-2: Resolving test reached"><span class="mark resolved" role="img" aria-label="Resolving test reached"></span></td><td headers="row-AC-001-2-2 col-TC-001-a-3" data-column="TC-001-a-3" title="AC-001-2-2 / TC-001-a-3: Not reached"><span class="mark empty" role="img" aria-label="Not reached"></span></td><td headers="row-AC-001-2-2 col-TC-001-a-4" data-column="TC-001-a-4" title="AC-001-2-2 / TC-001-a-4: Not reached"><span class="mark empty" role="img" aria-label="Not reached"></span></td><td headers="row-AC-001-2-2 col-BS-001-a" data-column="BS-001-a" title="AC-001-2-2 / BS-001-a: Reached without test semantics"><span class="mark reached" role="img" aria-label="Reached without test semantics"></span></td><td headers="row-AC-001-2-2 col-BS-001-b" data-column="BS-001-b" title="AC-001-2-2 / BS-001-b: Reached without test semantics"><span class="mark reached" role="img" aria-label="Reached without test semantics"></span></td><td headers="row-AC-001-2-2 col-TAC-4001" data-column="TAC-4001" title="AC-001-2-2 / TAC-4001: Reached without test semantics"><span class="mark reached" role="img" aria-label="Reached without test semantics"></span></td><td headers="row-AC-001-2-2 col-TAC-4012" data-column="TAC-4012" title="AC-001-2-2 / TAC-4012: Reached without test semantics"><span class="mark reached" role="img" aria-label="Reached without test semantics"></span></td>
164
+ <td class="note "><span class="sr-only">No issue noted</span></td>
165
+ </tr>
166
+ <tr class="criterion">
167
+ <th scope="row" id="row-AC-001-2-3" class="node"><a href="#" title="#tab=requirements&amp;entity=AC-001-2-3">AC-001-2-3</a></th>
168
+ <td class="label">Link to the source</td>
169
+ <td headers="row-AC-001-2-3 col-TS-001-a" data-column="TS-001-a" title="AC-001-2-3 / TS-001-a: Not reached"><span class="mark empty" role="img" aria-label="Not reached"></span></td><td headers="row-AC-001-2-3 col-TC-001-a-1" data-column="TC-001-a-1" title="AC-001-2-3 / TC-001-a-1: Not reached"><span class="mark empty" role="img" aria-label="Not reached"></span></td><td headers="row-AC-001-2-3 col-TC-001-a-2" data-column="TC-001-a-2" title="AC-001-2-3 / TC-001-a-2: Not reached"><span class="mark empty" role="img" aria-label="Not reached"></span></td><td headers="row-AC-001-2-3 col-TC-001-a-3" data-column="TC-001-a-3" title="AC-001-2-3 / TC-001-a-3: Test reached; pointer unresolved"><span class="mark unresolved" role="img" aria-label="Test reached; pointer unresolved"></span></td><td headers="row-AC-001-2-3 col-TC-001-a-4" data-column="TC-001-a-4" title="AC-001-2-3 / TC-001-a-4: Not reached"><span class="mark empty" role="img" aria-label="Not reached"></span></td><td headers="row-AC-001-2-3 col-BS-001-a" data-column="BS-001-a" title="AC-001-2-3 / BS-001-a: Reached without test semantics"><span class="mark reached" role="img" aria-label="Reached without test semantics"></span></td><td headers="row-AC-001-2-3 col-BS-001-b" data-column="BS-001-b" title="AC-001-2-3 / BS-001-b: Reached without test semantics"><span class="mark reached" role="img" aria-label="Reached without test semantics"></span></td><td headers="row-AC-001-2-3 col-TAC-4001" data-column="TAC-4001" title="AC-001-2-3 / TAC-4001: Reached without test semantics"><span class="mark reached" role="img" aria-label="Reached without test semantics"></span></td><td headers="row-AC-001-2-3 col-TAC-4012" data-column="TAC-4012" title="AC-001-2-3 / TAC-4012: Reached without test semantics"><span class="mark reached" role="img" aria-label="Reached without test semantics"></span></td>
170
+ <td class="note danger">no resolving test</td>
171
+ </tr>
172
+ <tr class="criterion">
173
+ <th scope="row" id="row-AC-001-2-4" class="node"><a href="#" title="#tab=requirements&amp;entity=AC-001-2-4">AC-001-2-4</a></th>
174
+ <td class="label">Show the re-check</td>
175
+ <td headers="row-AC-001-2-4 col-TS-001-a" data-column="TS-001-a" title="AC-001-2-4 / TS-001-a: Not reached"><span class="mark empty" role="img" aria-label="Not reached"></span></td><td headers="row-AC-001-2-4 col-TC-001-a-1" data-column="TC-001-a-1" title="AC-001-2-4 / TC-001-a-1: Not reached"><span class="mark empty" role="img" aria-label="Not reached"></span></td><td headers="row-AC-001-2-4 col-TC-001-a-2" data-column="TC-001-a-2" title="AC-001-2-4 / TC-001-a-2: Not reached"><span class="mark empty" role="img" aria-label="Not reached"></span></td><td headers="row-AC-001-2-4 col-TC-001-a-3" data-column="TC-001-a-3" title="AC-001-2-4 / TC-001-a-3: Not reached"><span class="mark empty" role="img" aria-label="Not reached"></span></td><td headers="row-AC-001-2-4 col-TC-001-a-4" data-column="TC-001-a-4" title="AC-001-2-4 / TC-001-a-4: Test reached; pointer unresolved"><span class="mark unresolved" role="img" aria-label="Test reached; pointer unresolved"></span></td><td headers="row-AC-001-2-4 col-BS-001-a" data-column="BS-001-a" title="AC-001-2-4 / BS-001-a: Reached without test semantics"><span class="mark reached" role="img" aria-label="Reached without test semantics"></span></td><td headers="row-AC-001-2-4 col-BS-001-b" data-column="BS-001-b" title="AC-001-2-4 / BS-001-b: Reached without test semantics"><span class="mark reached" role="img" aria-label="Reached without test semantics"></span></td><td headers="row-AC-001-2-4 col-TAC-4001" data-column="TAC-4001" title="AC-001-2-4 / TAC-4001: Reached without test semantics"><span class="mark reached" role="img" aria-label="Reached without test semantics"></span></td><td headers="row-AC-001-2-4 col-TAC-4012" data-column="TAC-4012" title="AC-001-2-4 / TAC-4012: Reached without test semantics"><span class="mark reached" role="img" aria-label="Reached without test semantics"></span></td>
176
+ <td class="note warning">pointer test-missing</td>
177
+ </tr></tbody>
178
+ </table>
179
+ </div>
180
+ <ul class="legend" id="matrix-legend" aria-label="Cell states">
181
+ <li><span class="mark resolved" aria-hidden="true"></span>Resolving test reached</li>
182
+ <li><span class="mark unresolved" aria-hidden="true"></span>Test pointer unresolved</li>
183
+ <li><span class="mark reached" aria-hidden="true"></span>Reached without test semantics</li>
184
+ <li><span class="mark empty" aria-hidden="true"></span>Empty: not reached</li>
185
+ </ul>
186
+ <div class="explanation">
187
+ <h2>Why a matrix and not a sunburst</h2>
188
+ <p>A sunburst of this chain draws 2,972 arcs and still cannot show reached-but-unresolved. A matrix reads left to right in chain order and filters by row.</p>
189
+ </div>
190
+ </section>
191
+ <p class="data">Data: <code>./trace.json?id=REQ-001&amp;direction=forward</code> (nodes and edges from <code>computeTrace</code>), component column from the story <code>tacIds</code>, cell colour from <code>coverage.acs[]</code>.</p>
192
+ <footer>Static sketch for the rcf-lite discovery document; mocked data, light theme.</footer>
193
+ </main>
194
+ </body>
195
+ </html>
@@ -0,0 +1,196 @@
1
+ <!doctype html>
2
+ <html lang="en-GB">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>Discovery sketch: 4-tables</title>
7
+ <style>
8
+ <!-- F7-note: these --sv-* hex tokens are the LIGHT-mode palette only; the dark-mode block lives in src/view/style.css under html[data-theme="dark"] (and its auto variant) and is covered pair-by-pair by test/view/contrast-aa.test.js. The sketches set color-scheme: light to keep OS dark-mode from re-inking them; the viewer runtime switches tokens by data-theme, not by color-scheme. -->
9
+ :root {
10
+ --sv-canvas: #F6F8FC;
11
+ --sv-surface: #FFFFFF;
12
+ --sv-raised: #EEF2F8;
13
+ --sv-ink: #111927;
14
+ --sv-muted: #536176;
15
+ --sv-border: #D8DFEA;
16
+ --sv-control: #738198;
17
+ --sv-link: #2447EB;
18
+ --sv-hover: #1737C7;
19
+ --sv-active: #E9EEFF;
20
+ --sv-button: #2447EB;
21
+ --sv-onbutton: #FFFFFF;
22
+ --sv-code: #EEF2F8;
23
+ --sv-success: #116B4D;
24
+ --sv-successbg: #E7F4ED;
25
+ --sv-warning: #895000;
26
+ --sv-warningbg: #FFF3DC;
27
+ --sv-danger: #B4233B;
28
+ --sv-dangerbg: #FDECF0;
29
+ --sv-focus: #2447EB;
30
+ --sv-font: Arial, Helvetica, sans-serif;
31
+ --sv-mono: ui-monospace, SFMono-Regular, Consolas, "Liberation Mono", monospace;
32
+ }
33
+ * { box-sizing: border-box; }
34
+ body { background: var(--sv-canvas); color: var(--sv-ink); font-family: var(--sv-font); margin: 0; }
35
+ main { max-width: 1100px; margin: 0 auto; padding: 36px 16px 24px; }
36
+ .intro { max-width: 890px; margin: 0 0 26px; font-size: 19px; line-height: 1.55; }
37
+ .panel { margin-bottom: 24px; border: 1px solid var(--sv-border); border-radius: 8px; background: var(--sv-surface); overflow: hidden; }
38
+ .panel-header { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 18px 20px; border-bottom: 1px solid var(--sv-border); }
39
+ .section-title { display: flex; align-items: center; gap: 12px; }
40
+ .section-number { display: grid; place-items: center; width: 28px; height: 28px; border-radius: 6px; background: var(--sv-active); color: var(--sv-link); font: 12px var(--sv-mono); }
41
+ h1, h2 { margin: 0; font-size: 20px; line-height: 1.3; }
42
+ .subtab-label { color: var(--sv-muted); font-size: 12px; }
43
+ table { width: 100%; border-collapse: collapse; table-layout: fixed; font-size: 13px; line-height: 1.55; }
44
+ caption { padding: 16px 20px 12px; color: var(--sv-muted); text-align: left; font-size: 12px; }
45
+ th, td { padding: 14px 10px; text-align: left; vertical-align: top; overflow-wrap: anywhere; }
46
+ thead th { padding-top: 10px; padding-bottom: 10px; background: var(--sv-raised); color: var(--sv-muted); font-size: 11px; font-weight: 700; border-top: 1px solid var(--sv-border); border-bottom: 1px solid var(--sv-border); }
47
+ tbody tr + tr > * { border-top: 1px solid var(--sv-border); }
48
+ tbody th { font-weight: 400; }
49
+ .question { font-weight: 700; line-height: 1.5; }
50
+ .questions col:nth-child(1) { width: 5%; }
51
+ .questions col:nth-child(2) { width: 19%; }
52
+ .questions col:nth-child(3) { width: 14%; }
53
+ .questions col:nth-child(4) { width: 20%; }
54
+ .questions col:nth-child(5) { width: 34%; }
55
+ .questions col:nth-child(6) { width: 8%; }
56
+ .blocking col:nth-child(1) { width: 7%; }
57
+ .blocking col:nth-child(2) { width: 19%; }
58
+ .blocking col:nth-child(3) { width: 12%; }
59
+ .blocking col:nth-child(4) { width: 27%; }
60
+ .blocking col:nth-child(5) { width: 27%; }
61
+ .blocking col:nth-child(6) { width: 8%; }
62
+ a { color: var(--sv-link); text-decoration: none; }
63
+ a:hover { color: var(--sv-hover); text-decoration: underline; }
64
+ a:focus-visible, button:focus-visible { outline: 2px solid var(--sv-focus); outline-offset: 3px; }
65
+ code, .mono { font-family: var(--sv-mono); font-size: 12px; }
66
+ .command { display: flex; align-items: flex-start; gap: 6px; }
67
+ .command code { min-width: 0; flex: 1; }
68
+ .code-chip { display: block; padding: 7px 8px; background: var(--sv-code); border-radius: 5px; line-height: 1.6; overflow-wrap: anywhere; }
69
+ .copy { flex: none; padding: 7px 8px; border: 1px solid var(--sv-control); border-radius: 5px; background: var(--sv-surface); color: var(--sv-muted); font: 11px var(--sv-font); line-height: 1.6; }
70
+ .pill { display: inline-block; padding: 3px 8px; border-radius: 999px; color: var(--sv-warning); background: var(--sv-warningbg); font-size: 11px; font-weight: 700; white-space: nowrap; }
71
+ .muted { color: var(--sv-muted); }
72
+ .helper { margin: 0; padding: 15px 20px; border-top: 1px solid var(--sv-border); color: var(--sv-muted); font-size: 12px; line-height: 1.6; }
73
+ .rcf-filterbar { display: flex; align-items: flex-end; gap: 12px; padding: 16px 20px; background: var(--sv-surface); border-bottom: 1px solid var(--sv-border); }
74
+ .filter-field { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
75
+ .filter-field:first-child { flex: 1; max-width: 290px; }
76
+ label { color: var(--sv-muted); font-size: 11px; font-weight: 700; }
77
+ input, select { width: 100%; min-width: 130px; height: 35px; padding: 7px 10px; border: 1px solid var(--sv-control); border-radius: 5px; background: var(--sv-surface); color: var(--sv-ink); font: 13px var(--sv-font); opacity: 1; }
78
+ input::placeholder { color: var(--sv-muted); opacity: 1; }
79
+ .visible-count { margin: 0 0 9px auto; color: var(--sv-muted); font-size: 12px; white-space: nowrap; }
80
+ .item-fragment { display: block; margin-top: 4px; color: var(--sv-muted); }
81
+ .source { margin: 4px 0 24px; color: var(--sv-muted); font-size: 12px; line-height: 1.7; overflow-wrap: anywhere; }
82
+ footer { border-top: 1px solid var(--sv-border); padding-top: 16px; color: var(--sv-muted); font-size: 11px; line-height: 1.6; }
83
+ @media (max-width: 719px) {
84
+ main { padding-top: 24px; }
85
+ .intro { font-size: 17px; }
86
+ .panel-header { padding: 16px; }
87
+ .rcf-filterbar { display: grid; grid-template-columns: 1fr; padding: 16px; }
88
+ .filter-field:first-child { max-width: none; }
89
+ .visible-count { margin: 0; }
90
+ table, tbody { display: block; width: 100%; }
91
+ colgroup { display: none; }
92
+ caption { display: block; padding: 14px 16px; }
93
+ thead { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); }
94
+ tbody tr { display: grid; grid-template-columns: 1fr; padding: 12px 16px; border-top: 1px solid var(--sv-border); }
95
+ tbody tr + tr > * { border-top: 0; }
96
+ tbody th, tbody td { display: grid; grid-template-columns: 94px minmax(0, 1fr); align-items: start; gap: 10px; padding: 7px 0; }
97
+ tbody th::before, tbody td::before { content: attr(data-label); color: var(--sv-muted); font: 11px/1.6 var(--sv-font); font-weight: 700; }
98
+ .pill { justify-self: start; }
99
+ .command { flex-wrap: wrap; }
100
+ .command code { flex-basis: 100%; }
101
+ .helper { padding: 14px 16px; }
102
+ }
103
+ </style>
104
+ </head>
105
+ <body>
106
+ <main>
107
+ <p class="intro">Questions and Blocking currently show cards; these two tabs turn them into tables with links to each item and exact commands to save answers or re-check blockers.</p>
108
+
109
+ <section class="panel" aria-labelledby="questions-heading">
110
+ <header class="panel-header">
111
+ <div class="section-title"><span class="section-number" aria-hidden="true">01</span><h1 id="questions-heading">Questions</h1></div>
112
+ <span class="subtab-label">Readiness sub-tab</span>
113
+ </header>
114
+ <table class="questions">
115
+ <caption>Questions for you, 3 rows</caption>
116
+ <colgroup><col><col><col><col><col><col></colgroup>
117
+ <thead><tr><th scope="col">#</th><th scope="col">Question</th><th scope="col">Where it lives</th><th scope="col">What settles it</th><th scope="col">Write-back</th><th scope="col">State</th></tr></thead>
118
+ <tbody>
119
+ <tr>
120
+ <td data-label="#"><span class="mono muted">1</span></td>
121
+ <th scope="row" data-label="Question"><span class="question">What is this project for?</span></th>
122
+ <td data-label="Where it lives"><a href="#" title="#brief-ledger">brief ledger</a></td>
123
+ <td data-label="What settles it"><span>A one-sentence statement; a few short bullets.</span></td>
124
+ <td data-label="Write-back"><div class="command"><code class="code-chip">rcf define ledger brief add --text &quot;&lt;text&gt;&quot;</code><button class="copy" type="button" title="copies the brief ledger write-back command (static mock)" aria-disabled="true">Copy</button></div></td>
125
+ <td data-label="State"><span class="pill">open</span></td>
126
+ </tr>
127
+ <tr>
128
+ <td data-label="#"><span class="mono muted">2</span></td>
129
+ <th scope="row" data-label="Question"><span class="question">Where will you look at what we produce?</span></th>
130
+ <td data-label="Where it lives"><a href="#" title="#profile:surface">profile: review surface</a></td>
131
+ <td data-label="What settles it"><span>Pick one: viewer, agent, pdf export, slide deck.</span></td>
132
+ <td data-label="Write-back"><div class="command"><code class="code-chip">rcf define profile set reviewSurface --value viewer</code><button class="copy" type="button" title="copies the review surface write-back command (static mock)" aria-disabled="true">Copy</button></div></td>
133
+ <td data-label="State"><span class="pill">open</span></td>
134
+ </tr>
135
+ <tr>
136
+ <td data-label="#"><span class="mono muted">3</span></td>
137
+ <th scope="row" data-label="Question"><span class="question">Who is writing this?</span></th>
138
+ <td data-label="Where it lives"><a class="mono" href="#" title="#tab=requirements&amp;entity=REQ-012">REQ-012</a></td>
139
+ <td data-label="What settles it"><span>Name the author or team.</span></td>
140
+ <td data-label="Write-back"><div class="command"><code class="code-chip">rcf define story set --us US-012-1 --author &quot;&lt;name&gt;&quot;</code><button class="copy" type="button" title="copies the story author write-back command (static mock)" aria-disabled="true">Copy</button></div></td>
141
+ <td data-label="State"><span class="pill">open</span></td>
142
+ </tr>
143
+ </tbody>
144
+ </table>
145
+ <p class="helper">Answer in your agent session or run the write-back; this page updates on its own.</p>
146
+ </section>
147
+
148
+ <section class="panel" aria-labelledby="blocking-heading">
149
+ <header class="panel-header">
150
+ <div class="section-title"><span class="section-number" aria-hidden="true">02</span><h2 id="blocking-heading">Blocking</h2></div>
151
+ <span class="subtab-label">Readiness sub-tab</span>
152
+ </header>
153
+ <div class="rcf-filterbar" aria-label="Blocking filters (static mock)">
154
+ <div class="filter-field"><label for="filter">Search</label><input id="filter" type="text" placeholder="Filter" disabled title="would filter blocking items"></div>
155
+ <div class="filter-field"><label for="stage">Stage</label><select id="stage" disabled title="would filter by stage"><option selected>All stages</option><option>D1</option><option>D2</option><option>D3</option><option>D4</option><option>D5</option><option>D6</option><option>D7</option><option>D8</option></select></div>
156
+ <div class="filter-field"><label for="persona">Persona</label><select id="persona" disabled title="would filter by persona"><option>All</option><option>Operator</option><option selected>Engineer</option><option>Agent</option></select></div>
157
+ <p class="visible-count">3 of 3 visible</p>
158
+ </div>
159
+ <table class="blocking">
160
+ <caption>Blocking items for engineers, 3 rows</caption>
161
+ <colgroup><col><col><col><col><col><col></colgroup>
162
+ <thead><tr><th scope="col">Stage</th><th scope="col">Check</th><th scope="col">Item</th><th scope="col">Why</th><th scope="col">Re-check</th><th scope="col">Trace</th></tr></thead>
163
+ <tbody>
164
+ <tr>
165
+ <td data-label="Stage"><span class="mono">D6</span></td>
166
+ <td data-label="Check"><code>consistency:unsatisfiable</code></td>
167
+ <th scope="row" data-label="Item"><span><a class="mono" href="#" title="#tab=requirements&amp;entity=AC-060-3">AC-060-3</a><span class="item-fragment mono">userID</span></span></th>
168
+ <td data-label="Why"><span>then names field userID that no recordShape defines</span></td>
169
+ <td data-label="Re-check"><code class="code-chip">rcf define readiness --check consistency</code></td>
170
+ <td data-label="Trace"><a href="#" title="#tab=trace&amp;id=AC-060-3">Trace</a></td>
171
+ </tr>
172
+ <tr>
173
+ <td data-label="Stage"><span class="mono">D6</span></td>
174
+ <td data-label="Check"><code>consistency:unsatisfiable</code></td>
175
+ <th scope="row" data-label="Item"><a class="mono" href="#" title="#tab=requirements&amp;entity=AC-074-1">AC-074-1</a></th>
176
+ <td data-label="Why"><span>and expects a response field name that no recordShape defines</span></td>
177
+ <td data-label="Re-check"><code class="code-chip">rcf define readiness --check consistency</code></td>
178
+ <td data-label="Trace"><a href="#" title="#tab=trace&amp;id=AC-074-1">Trace</a></td>
179
+ </tr>
180
+ <tr>
181
+ <td data-label="Stage"><span class="mono">D8</span></td>
182
+ <td data-label="Check"><code>freeze:priorGates</code></td>
183
+ <th scope="row" data-label="Item"><a class="mono" href="#" title="#stage=D6">D6</a></th>
184
+ <td data-label="Why"><span>freeze cannot run because D6 has unresolved items</span></td>
185
+ <td data-label="Re-check"><code class="code-chip">rcf define readiness --check freeze</code></td>
186
+ <td data-label="Trace"><a href="#" title="#tab=trace&amp;stage=D6">Trace</a></td>
187
+ </tr>
188
+ </tbody>
189
+ </table>
190
+ </section>
191
+
192
+ <p class="source">Data: readiness.questions[] with writeBack[].command and itemId; readiness.stages[].checks[].failing[].{id, why} and readiness.personas.engineer.blockers[]. Today these render as cards with no links, no table and a 20-id cap.</p>
193
+ <footer>Static sketch for the rcf-lite discovery document; mocked data, light theme.</footer>
194
+ </main>
195
+ </body>
196
+ </html>