@azure-id/orc 0.56.0 → 1.0.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 (153) hide show
  1. package/CHANGELOG.md +228 -0
  2. package/README-id.md +143 -53
  3. package/README.md +124 -103
  4. package/bin/build-agents.js +18 -11
  5. package/bin/cli.js +4139 -315
  6. package/bin/onboarding-content.js +0 -3
  7. package/bin/test-run.js +491 -0
  8. package/bin/verify-contracts.js +4256 -3277
  9. package/bin/verify-package.js +563 -498
  10. package/bin/webui/api.js +1186 -1163
  11. package/bin/webui/app.html +9 -0
  12. package/bin/webui/css/06-responsive.css +120 -108
  13. package/bin/webui/css/panels/extra.css +29 -0
  14. package/bin/webui/css/panels/lanes.css +134 -0
  15. package/bin/webui/css/panels/settings.css +79 -3
  16. package/bin/webui/fixtures/extra.js +2036 -1934
  17. package/bin/webui/fixtures/flow.js +2 -2
  18. package/bin/webui/fixtures/index.js +503 -486
  19. package/bin/webui/fixtures/lanes.js +218 -0
  20. package/bin/webui/fixtures/settings.js +261 -34
  21. package/bin/webui/fixtures/stats.js +3 -3
  22. package/bin/webui/i18n/TERMS.md +135 -134
  23. package/bin/webui/i18n/en/extra.json +345 -313
  24. package/bin/webui/i18n/en/lanes.json +29 -0
  25. package/bin/webui/i18n/en/nav.json +1 -0
  26. package/bin/webui/i18n/en/overview.json +2 -0
  27. package/bin/webui/i18n/en/settings.json +16 -5
  28. package/bin/webui/i18n/id/extra.json +345 -313
  29. package/bin/webui/i18n/id/lanes.json +29 -0
  30. package/bin/webui/i18n/id/nav.json +1 -0
  31. package/bin/webui/i18n/id/overview.json +2 -0
  32. package/bin/webui/i18n/id/settings.json +15 -4
  33. package/bin/webui/js/01-i18n.js +1 -0
  34. package/bin/webui/js/panels/extra.js +3199 -3011
  35. package/bin/webui/js/panels/lanes.js +259 -0
  36. package/bin/webui/js/panels/overview.js +10 -0
  37. package/bin/webui/js/panels/settings.js +149 -3
  38. package/package.json +3 -3
  39. package/templates/agents/MODEL-MAPPING.md +23 -35
  40. package/templates/agents/orc-executor-opus-4-7-high.md +1 -1
  41. package/templates/agents/orc-executor-opus-4-7-med.md +1 -1
  42. package/templates/agents/orc-executor-opus-4-8-high.md +1 -1
  43. package/templates/agents/orc-executor-opus-5-high.md +1 -1
  44. package/templates/agents/orc-executor-opus-5-low.md +1 -1
  45. package/templates/agents/orc-executor-opus-5-med.md +1 -1
  46. package/templates/agents/orc-retro-opus-5-med.md +73 -73
  47. package/templates/agents/orc-retro-sonnet-5-high.md +72 -72
  48. package/templates/agents/orc-trace-writer-haiku-4-5.md +107 -107
  49. package/templates/commands/orc-route.md +1 -1
  50. package/templates/commands/orc.md +1 -1
  51. package/templates/skills/_shared/README.md +7 -3
  52. package/templates/skills/_shared/config-precedence.md +198 -0
  53. package/templates/skills/_shared/drift-recovery.md +1 -1
  54. package/templates/skills/_shared/extra-dispatch.md +292 -6
  55. package/templates/skills/_shared/interview.md +1 -1
  56. package/templates/skills/_shared/opus5-only.md +9 -7
  57. package/templates/skills/_shared/phases/README.md +82 -0
  58. package/templates/skills/{orc/references → _shared/phases}/analyst-gates.md +15 -3
  59. package/templates/skills/_shared/phases/execution.md +143 -0
  60. package/templates/skills/{orc/references → _shared/phases}/house-rules.md +13 -1
  61. package/templates/skills/{orc/references → _shared/phases}/intake.md +15 -2
  62. package/templates/skills/_shared/phases/mock-example.md +56 -0
  63. package/templates/skills/{orc/references → _shared/phases}/plan-handoff.md +16 -3
  64. package/templates/skills/_shared/phases/planning.md +135 -0
  65. package/templates/skills/_shared/phases/preflight.md +76 -0
  66. package/templates/skills/_shared/phases/review.md +53 -0
  67. package/templates/skills/_shared/phases/scoring.md +65 -0
  68. package/templates/skills/{orc/references → _shared/phases}/security-checklist.md +12 -1
  69. package/templates/skills/_shared/phases/security.md +55 -0
  70. package/templates/skills/_shared/phases/ship.md +88 -0
  71. package/templates/skills/{orc/references/stop-and-resume.md → _shared/phases/stop-resume.md} +169 -160
  72. package/templates/skills/_shared/phases/summary.md +48 -0
  73. package/templates/skills/_shared/phases/testgen.md +51 -0
  74. package/templates/skills/{orc/references/trace-protocol.md → _shared/phases/trace.md} +49 -6
  75. package/templates/skills/_shared/phases/verify.md +70 -0
  76. package/templates/skills/{orc/references → _shared/phases}/wave-grouping.md +14 -2
  77. package/templates/skills/{orc/references → _shared/phases}/wiki-consult.md +13 -1
  78. package/templates/skills/_shared/read-ladder.md +48 -0
  79. package/templates/skills/context-combiner/SKILL.md +214 -187
  80. package/templates/skills/orc/README.md +148 -150
  81. package/templates/skills/orc/SKILL.md +70 -358
  82. package/templates/skills/orc/config.md +137 -389
  83. package/templates/skills/orc/examples/full-run-mock.md +1 -1
  84. package/templates/skills/orc/references/effort-and-mode.md +16 -18
  85. package/templates/skills/orc/references/phases/intake.md +47 -0
  86. package/templates/skills/orc/references/phases/integration.md +19 -0
  87. package/templates/skills/orc/references/preflight-report.md +4 -4
  88. package/templates/skills/orc/references/ultra-mode.md +117 -123
  89. package/templates/skills/orc/schemas/planning-output.md +279 -279
  90. package/templates/skills/orc/subskills/orc-planner/SKILL.md +260 -264
  91. package/templates/skills/orc/subskills/orc-pr/stack-gate.md +4 -1
  92. package/templates/skills/orc-aftermath/SKILL.md +153 -136
  93. package/templates/skills/orc-analyze/SKILL.md +247 -220
  94. package/templates/skills/orc-analyze/references/branching.md +51 -51
  95. package/templates/skills/orc-analyze/references/thin-input.md +1 -1
  96. package/templates/skills/orc-analyze-mini/SKILL.md +128 -112
  97. package/templates/skills/orc-boundary/SKILL.md +244 -208
  98. package/templates/skills/orc-brainstorm/SKILL.md +372 -339
  99. package/templates/skills/orc-budget/SKILL.md +243 -225
  100. package/templates/skills/orc-challenge/README.md +1 -1
  101. package/templates/skills/orc-challenge/SKILL.md +293 -255
  102. package/templates/skills/orc-challenge/examples/council-full-roster.md +1 -1
  103. package/templates/skills/orc-claude/SKILL.md +216 -199
  104. package/templates/skills/orc-diy/README.md +2 -1
  105. package/templates/skills/orc-diy/SKILL.md +129 -70
  106. package/templates/skills/orc-diy/references/blocks/analyze.md +1 -1
  107. package/templates/skills/orc-diy/references/compile.md +21 -7
  108. package/templates/skills/orc-diy/references/flow-schema.md +2 -2
  109. package/templates/skills/orc-doc/SKILL.md +44 -7
  110. package/templates/skills/orc-explain/SKILL.md +19 -0
  111. package/templates/skills/orc-export/SKILL.md +26 -5
  112. package/templates/skills/orc-fast/SKILL.md +215 -187
  113. package/templates/skills/orc-grill/SKILL.md +233 -207
  114. package/templates/skills/orc-handoff/SKILL.md +223 -204
  115. package/templates/skills/orc-learn/SKILL.md +176 -156
  116. package/templates/skills/orc-mini/SKILL.md +41 -23
  117. package/templates/skills/orc-pact/SKILL.md +250 -218
  118. package/templates/skills/orc-pattern/SKILL.md +149 -124
  119. package/templates/skills/orc-poly/SKILL.md +237 -216
  120. package/templates/skills/orc-poly/references/gather.md +1 -1
  121. package/templates/skills/orc-pr-driver/SKILL.md +196 -167
  122. package/templates/skills/orc-pr-driver/references/orc-run-split.md +1 -1
  123. package/templates/skills/orc-pr-setup/SKILL.md +212 -184
  124. package/templates/skills/orc-quick/README.md +2 -2
  125. package/templates/skills/orc-quick/SKILL.md +346 -313
  126. package/templates/skills/orc-quick/references/dispatch-gate.md +12 -4
  127. package/templates/skills/orc-retro/SKILL.md +244 -222
  128. package/templates/skills/orc-retro/examples/retro-mock.md +171 -171
  129. package/templates/skills/orc-route/SKILL.md +183 -165
  130. package/templates/skills/orc-verify/SKILL.md +100 -86
  131. package/templates/skills/orc-wiki/SKILL.md +55 -206
  132. package/templates/skills/orc-wiki/references/phases/phase-0.md +71 -0
  133. package/templates/skills/orc-wiki/references/phases/phase-1.md +35 -0
  134. package/templates/skills/orc-wiki/references/phases/phase-2.md +52 -0
  135. package/templates/skills/orc-wiki/references/phases/phase-3.md +57 -0
  136. package/templates/skills/orc-wiki/references/phases/phase-3c.md +36 -0
  137. package/templates/agents/orc-advisor-fable-5.md +0 -50
  138. package/templates/agents/orc-analyst-fable-5.md +0 -115
  139. package/templates/agents/orc-judge-fable-5.md +0 -79
  140. package/templates/agents/orc-planner-fable-5.md +0 -152
  141. package/templates/agents/orc-reviewer-fable-5.md +0 -57
  142. package/templates/skills/_shared/fable5-override.md +0 -56
  143. package/templates/skills/orc-diy/references/blocks/execution.md +0 -42
  144. package/templates/skills/orc-diy/references/blocks/mock-example.md +0 -22
  145. package/templates/skills/orc-diy/references/blocks/planning.md +0 -34
  146. package/templates/skills/orc-diy/references/blocks/review.md +0 -18
  147. package/templates/skills/orc-diy/references/blocks/scoring.md +0 -16
  148. package/templates/skills/orc-diy/references/blocks/security.md +0 -25
  149. package/templates/skills/orc-diy/references/blocks/ship.md +0 -25
  150. package/templates/skills/orc-diy/references/blocks/summary.md +0 -18
  151. package/templates/skills/orc-diy/references/blocks/testgen.md +0 -17
  152. package/templates/skills/orc-diy/references/blocks/trace.md +0 -28
  153. package/templates/skills/orc-diy/references/blocks/verify.md +0 -25
@@ -24,6 +24,7 @@
24
24
  <link rel="stylesheet" href="css/panels/overview.css">
25
25
  <link rel="stylesheet" href="css/05-tour.css">
26
26
  <link rel="stylesheet" href="css/panels/settings.css">
27
+ <link rel="stylesheet" href="css/panels/lanes.css">
27
28
  <link rel="stylesheet" href="css/panels/runs.css">
28
29
  <link rel="stylesheet" href="css/panels/knowledge.css">
29
30
  <link rel="stylesheet" href="css/panels/stats.css">
@@ -69,6 +70,13 @@
69
70
  <ul class="nav" id="nav">
70
71
  <li><a href="#/overview" data-panel="overview" data-idx="1" data-i18n="nav.overview">Overview</a></li>
71
72
  <li><a href="#/settings" data-panel="settings" data-idx="2" data-i18n="nav.settings">Settings</a></li>
73
+ <!--
74
+ v1.0.0 W16. Lanes sits directly under Settings because it answers the
75
+ other half of the same question. Settings says what a key resolves to
76
+ and which lanes read it; this says what those lanes then DO with it —
77
+ which shared phases they run, in order, and which CLI calls they make.
78
+ -->
79
+ <li><a href="#/lanes" data-panel="lanes" data-idx="l" data-i18n="nav.lanes">Lanes</a></li>
72
80
  <li><a href="#/runs" data-panel="runs" data-idx="3" data-i18n="nav.runs">Runs</a></li>
73
81
  <li><a href="#/knowledge" data-panel="knowledge" data-idx="4" data-i18n="nav.knowledge">Knowledge</a></li>
74
82
  <li><a href="#/stats" data-panel="stats" data-idx="5" data-i18n="nav.stats">Stats</a></li>
@@ -176,6 +184,7 @@
176
184
  <script src="js/06-edit.js"></script>
177
185
  <script src="js/panels/overview.js"></script>
178
186
  <script src="js/panels/settings.js"></script>
187
+ <script src="js/panels/lanes.js"></script>
179
188
  <script src="js/panels/runs.js"></script>
180
189
  <script src="js/panels/knowledge.js"></script>
181
190
  <script src="js/panels/stats.js"></script>
@@ -1,108 +1,120 @@
1
- /* 06-responsive.css — orc ui
2
- The width breakpoints that cross panel boundaries (the rail becomes a strip,
3
- the Learn rail becomes a scrollable row). They override rules from the shell
4
- AND from four panels, so they load after every one of them — the same reason
5
- 04-motion.css is last. Breakpoints that only touch ONE panel stay in that
6
- panel's file.
7
-
8
- The <link> ORDER in app.html is the cascade order, and the numeric
9
- prefix is that order. No @import: it would carry no session token and
10
- 401. */
11
-
12
- /* --------------------------------------------------------------- RESPONSIVE */
13
-
14
- @media (max-width: 1040px) {
15
- /* The Learn rail stops being a rail and becomes a scrollable strip above the
16
- reading pane — a 244px column plus prose does not fit twice over. */
17
- .learn { grid-template-columns: 1fr; }
18
- .learn-side { position: static; max-height: none; }
19
- .learn-nav { flex-direction: row; overflow-x: auto; padding-bottom: 2px; }
20
- .learn-nav-item { flex: 0 0 auto; max-width: 210px; }
21
- }
22
-
23
- @media (max-width: 900px) {
24
- .shell { grid-template-columns: 1fr; }
25
- .rail {
26
- position: static;
27
- height: auto;
28
- flex-direction: row;
29
- align-items: center;
30
- gap: var(--sp-4);
31
- overflow-x: auto;
32
- border-right: 0;
33
- border-bottom: 1px solid var(--line-soft);
34
- }
35
- .nav { flex-direction: row; flex-wrap: nowrap; }
36
- .nav a { white-space: nowrap; }
37
- .rail-foot { flex-direction: row; align-items: center; }
38
- .rail-project { max-width: 180px; }
39
- .main { padding: var(--sp-4); }
40
- .setting { grid-template-columns: 1fr; }
41
- .setting-control { align-items: flex-start; }
42
- /* Every `.run-card` VARIANT collapses explicitly. A variant that inherits a
43
- column count it does not have is the v0.49.2 Overview collision again, just
44
- at a narrower width. */
45
- .run-card { grid-template-columns: 16px 80px minmax(0, 1fr); }
46
- .run-card.no-caret { grid-template-columns: 80px minmax(0, 1fr); }
47
- .run-card.has-extra { grid-template-columns: 16px 80px auto minmax(0, 1fr); }
48
- .run-card.no-caret.has-extra { grid-template-columns: 80px auto minmax(0, 1fr); }
49
- .run-age { grid-column: 3; }
50
- .run-card.no-caret .run-age { grid-column: 2; }
51
- .run-card.has-extra .run-age { grid-column: 4; }
52
- .run-card.no-caret.has-extra .run-age { grid-column: 3; }
53
- .todo { grid-template-columns: 4px minmax(0, 1fr); }
54
- .todo-cta { grid-column: 2; margin-top: var(--sp-2); }
55
- /* Extra. v0.50.0 brought the rail's segment floor down here so a band was
56
- never squeezed to a sliver. v0.53.0 deleted that floor entirely: the band
57
- ladder puts the proportional bar INSIDE a full-width row, so there is
58
- nothing left to squeeze and nothing left to tune per viewport. What the
59
- ladder does need at this width is for its head to stop pretending it has
60
- five columns. */
61
- .ex-band-head { grid-template-columns: minmax(0, 30%) minmax(0, auto) minmax(0, 1fr) 16px; }
62
- /* v0.55.0 — EVERY VARIANT COLLAPSES EXPLICITLY. A position row has no bar, so
63
- its first column is the slot name rather than a track; leaving it on the
64
- band template here would put the target under the caret. */
65
- .ex-slot-head { grid-template-columns: minmax(0, 40%) minmax(0, 1fr) 16px; }
66
- .ex-slot-when { grid-column: 1 / -1; }
67
- .ex-band-chips { grid-column: 1 / -1; justify-content: flex-start; }
68
- .ex-route-controls { align-items: stretch; }
69
- .ex-route-controls .btn { width: 100%; }
70
- /* v0.53.0 `.ex-tool` was the one `.ex-*` block with no entry here at all.
71
- At this width a tool card's actions are the reason you opened the panel, so
72
- they go full width rather than being squeezed onto the end of a row. */
73
- .ex-tool > .row-actions:not(:first-child) { align-items: stretch; }
74
- .ex-tool > .row-actions:not(:first-child) .btn { width: 100%; }
75
- /* v0.54.0 a recovery row's identity is the longest thing in it, so at this
76
- width it takes its own line rather than truncating a profile and a model
77
- into nothing. The row is a FLEX COLUMN, so this is a wrap rather than a
78
- second grid template. */
79
- .ex-rec-head { flex-wrap: wrap; }
80
- .ex-rec-who { flex: 1 1 100%; white-space: normal; }
81
- }
82
-
83
- @media (max-width: 600px) {
84
- /* Below this there is no honest way to keep a chip, a slug and an age on one
85
- line, so the card stacks: chip, then the slug and where it stands, then the
86
- age. One column, in reading order. */
87
- .run-card,
88
- .run-card.no-caret,
89
- .run-card.has-extra,
90
- .run-card.no-caret.has-extra {
91
- grid-template-columns: minmax(0, 1fr);
92
- gap: var(--sp-2);
93
- }
94
- .run-caret { display: none; }
95
- .run-card .run-age { grid-column: 1; }
96
- /* Extra: the provider catalog stops being a grid below this a two-column
97
- tile cannot hold a base URL and two links without wrapping mid-word and
98
- the connect form's two columns become one. */
99
- .ex-provider-grid { grid-template-columns: minmax(0, 1fr); }
100
- .ex-strip { gap: var(--sp-3); }
101
- .ex-route-controls > * { flex: 1 1 100%; }
102
- /* The tool card's head stops being a row: a label, a binary name and a state
103
- chip cannot share a line honestly below this. */
104
- .ex-tool > .row-actions:first-child { flex-direction: column; align-items: flex-start; }
105
- /* A per-file position line cannot hold a path, a state word and a line delta
106
- on one row below this — and the path is the half that must stay readable. */
107
- .ex-rec-file { flex-direction: column; align-items: flex-start; }
108
- }
1
+ /* 06-responsive.css — orc ui
2
+ The width breakpoints that cross panel boundaries (the rail becomes a strip,
3
+ the Learn rail becomes a scrollable row). They override rules from the shell
4
+ AND from four panels, so they load after every one of them — the same reason
5
+ 04-motion.css is last. Breakpoints that only touch ONE panel stay in that
6
+ panel's file.
7
+
8
+ The <link> ORDER in app.html is the cascade order, and the numeric
9
+ prefix is that order. No @import: it would carry no session token and
10
+ 401. */
11
+
12
+ /* --------------------------------------------------------------- RESPONSIVE */
13
+
14
+ @media (max-width: 1040px) {
15
+ /* The Learn rail stops being a rail and becomes a scrollable strip above the
16
+ reading pane — a 244px column plus prose does not fit twice over. */
17
+ .learn { grid-template-columns: 1fr; }
18
+ .learn-side { position: static; max-height: none; }
19
+ .learn-nav { flex-direction: row; overflow-x: auto; padding-bottom: 2px; }
20
+ .learn-nav-item { flex: 0 0 auto; max-width: 210px; }
21
+ }
22
+
23
+ @media (max-width: 900px) {
24
+ .shell { grid-template-columns: 1fr; }
25
+ .rail {
26
+ position: static;
27
+ height: auto;
28
+ flex-direction: row;
29
+ align-items: center;
30
+ gap: var(--sp-4);
31
+ overflow-x: auto;
32
+ border-right: 0;
33
+ border-bottom: 1px solid var(--line-soft);
34
+ }
35
+ .nav { flex-direction: row; flex-wrap: nowrap; }
36
+ .nav a { white-space: nowrap; }
37
+ .rail-foot { flex-direction: row; align-items: center; }
38
+ .rail-project { max-width: 180px; }
39
+ .main { padding: var(--sp-4); }
40
+ .setting { grid-template-columns: 1fr; }
41
+ .setting-control { align-items: flex-start; }
42
+ /* The rank ladder keeps its prio column it is 34px and it is the thing
43
+ that makes the row readable as a ladder rather than a list. The state
44
+ chip wraps under instead, which is the only child that can spare the
45
+ line. Declared explicitly, like every `.run-card` variant below. */
46
+ .rank-row { grid-template-columns: 34px minmax(0, 1fr); }
47
+ .rank-row > .chip { grid-column: 2; justify-self: start; }
48
+ /* A phase row drops its right-hand column under the body rather than
49
+ squeezing it: `read`, `when` and the layer list are facts, and a fact
50
+ wrapped to one character per line is not readable. Declared explicitly. */
51
+ .phase-row { grid-template-columns: 28px minmax(0, 1fr); }
52
+ .phase-right { grid-column: 2; flex-direction: row; flex-wrap: wrap; align-items: center; }
53
+ .call-detail { padding-left: var(--sp-3); }
54
+ /* Every `.run-card` VARIANT collapses explicitly. A variant that inherits a
55
+ column count it does not have is the v0.49.2 Overview collision again, just
56
+ at a narrower width. */
57
+ .run-card { grid-template-columns: 16px 80px minmax(0, 1fr); }
58
+ .run-card.no-caret { grid-template-columns: 80px minmax(0, 1fr); }
59
+ .run-card.has-extra { grid-template-columns: 16px 80px auto minmax(0, 1fr); }
60
+ .run-card.no-caret.has-extra { grid-template-columns: 80px auto minmax(0, 1fr); }
61
+ .run-age { grid-column: 3; }
62
+ .run-card.no-caret .run-age { grid-column: 2; }
63
+ .run-card.has-extra .run-age { grid-column: 4; }
64
+ .run-card.no-caret.has-extra .run-age { grid-column: 3; }
65
+ .todo { grid-template-columns: 4px minmax(0, 1fr); }
66
+ .todo-cta { grid-column: 2; margin-top: var(--sp-2); }
67
+ /* Extra. v0.50.0 brought the rail's segment floor down here so a band was
68
+ never squeezed to a sliver. v0.53.0 deleted that floor entirely: the band
69
+ ladder puts the proportional bar INSIDE a full-width row, so there is
70
+ nothing left to squeeze and nothing left to tune per viewport. What the
71
+ ladder does need at this width is for its head to stop pretending it has
72
+ five columns. */
73
+ .ex-band-head { grid-template-columns: minmax(0, 30%) minmax(0, auto) minmax(0, 1fr) 16px; }
74
+ /* v0.55.0 EVERY VARIANT COLLAPSES EXPLICITLY. A position row has no bar, so
75
+ its first column is the slot name rather than a track; leaving it on the
76
+ band template here would put the target under the caret. */
77
+ .ex-slot-head { grid-template-columns: minmax(0, 40%) minmax(0, 1fr) 16px; }
78
+ .ex-slot-when { grid-column: 1 / -1; }
79
+ .ex-band-chips { grid-column: 1 / -1; justify-content: flex-start; }
80
+ .ex-route-controls { align-items: stretch; }
81
+ .ex-route-controls .btn { width: 100%; }
82
+ /* v0.53.0 — `.ex-tool` was the one `.ex-*` block with no entry here at all.
83
+ At this width a tool card's actions are the reason you opened the panel, so
84
+ they go full width rather than being squeezed onto the end of a row. */
85
+ .ex-tool > .row-actions:not(:first-child) { align-items: stretch; }
86
+ .ex-tool > .row-actions:not(:first-child) .btn { width: 100%; }
87
+ /* v0.54.0 — a recovery row's identity is the longest thing in it, so at this
88
+ width it takes its own line rather than truncating a profile and a model
89
+ into nothing. The row is a FLEX COLUMN, so this is a wrap rather than a
90
+ second grid template. */
91
+ .ex-rec-head { flex-wrap: wrap; }
92
+ .ex-rec-who { flex: 1 1 100%; white-space: normal; }
93
+ }
94
+
95
+ @media (max-width: 600px) {
96
+ /* Below this there is no honest way to keep a chip, a slug and an age on one
97
+ line, so the card stacks: chip, then the slug and where it stands, then the
98
+ age. One column, in reading order. */
99
+ .run-card,
100
+ .run-card.no-caret,
101
+ .run-card.has-extra,
102
+ .run-card.no-caret.has-extra {
103
+ grid-template-columns: minmax(0, 1fr);
104
+ gap: var(--sp-2);
105
+ }
106
+ .run-caret { display: none; }
107
+ .run-card .run-age { grid-column: 1; }
108
+ /* Extra: the provider catalog stops being a grid — below this a two-column
109
+ tile cannot hold a base URL and two links without wrapping mid-word — and
110
+ the connect form's two columns become one. */
111
+ .ex-provider-grid { grid-template-columns: minmax(0, 1fr); }
112
+ .ex-strip { gap: var(--sp-3); }
113
+ .ex-route-controls > * { flex: 1 1 100%; }
114
+ /* The tool card's head stops being a row: a label, a binary name and a state
115
+ chip cannot share a line honestly below this. */
116
+ .ex-tool > .row-actions:first-child { flex-direction: column; align-items: flex-start; }
117
+ /* A per-file position line cannot hold a path, a state word and a line delta
118
+ on one row below this — and the path is the half that must stay readable. */
119
+ .ex-rec-file { flex-direction: column; align-items: flex-start; }
120
+ }
@@ -534,3 +534,32 @@
534
534
  border-radius: var(--r-sm);
535
535
  padding: var(--sp-2) var(--sp-3);
536
536
  }
537
+
538
+ /* ── the run demotion (v1.0.0 W16) ────────────────────────────────────────────
539
+ A FLEX COLUMN, never a declared grid. Four evidence lines are optional —
540
+ `why`, a live stale attempt, a counter reset, a resume count — so the child
541
+ count changes with the state, and a card whose child count changes with its
542
+ state must not declare its rows. That is exactly what stretched `.ex-tool`'s
543
+ chip into a 250px ellipse in v0.53.0. */
544
+ .ex-dem-row {
545
+ display: flex;
546
+ flex-direction: column;
547
+ gap: 4px;
548
+ padding: var(--sp-2) var(--sp-3);
549
+ background: var(--surface-2);
550
+ border: 1px solid var(--line-soft);
551
+ border-radius: var(--radius-sm);
552
+ margin-top: 4px;
553
+ }
554
+ .ex-dem-row.is-demoted { border-color: var(--bad); background: var(--bad-wash, var(--surface-2)); }
555
+ .ex-dem-head {
556
+ display: flex;
557
+ flex-wrap: wrap;
558
+ align-items: center;
559
+ gap: var(--sp-2);
560
+ }
561
+ .ex-dem-profile { font-family: var(--mono); font-size: 13px; color: var(--text); }
562
+ /* The counter renders at zero too, so it is a stated fact and never a badge
563
+ that only appears when something is wrong. */
564
+ .ex-dem-count { font-family: var(--mono); font-size: 11px; color: var(--text-faint); margin-left: auto; }
565
+ .ex-dem-why { font-size: 12px; color: var(--text-faint); overflow-wrap: anywhere; }
@@ -0,0 +1,134 @@
1
+ /* panels/lanes.css — the `orc lane` noun, rendered.
2
+ Loaded by app.html in the order its <link> names, which for CSS is the
3
+ cascade order. Every colour is a token from 00-tokens.css. */
4
+
5
+ /* ── the lane picker ──────────────────────────────────────────────────────── */
6
+ .lane-meta {
7
+ display: flex;
8
+ flex-wrap: wrap;
9
+ align-items: center;
10
+ gap: 6px;
11
+ margin-bottom: var(--sp-3);
12
+ }
13
+ .lane-meta-label { font-size: 12px; color: var(--text-faint); }
14
+
15
+ /* ── a phase row ──────────────────────────────────────────────────────────────
16
+ A GRID that DECLARES its columns, and whose child count never varies with
17
+ state: ordinal · body · right-hand facts. `optional_when` is an optional
18
+ FOURTH child, so it takes a full-width line of its own rather than a column
19
+ it usually leaves empty — the `.ex-tool` lesson (v0.53.0), where a card
20
+ declaring rows its states did not all have stretched a chip into an ellipse. */
21
+ .phase-row {
22
+ display: grid;
23
+ grid-template-columns: 28px minmax(0, 1fr) auto;
24
+ align-items: start;
25
+ gap: var(--sp-3);
26
+ padding: var(--sp-2) var(--sp-3);
27
+ background: var(--surface-2);
28
+ border: 1px solid var(--line-soft);
29
+ border-radius: var(--radius-sm);
30
+ margin-bottom: 4px;
31
+ }
32
+ .phase-ord {
33
+ font-family: var(--mono);
34
+ font-size: 12px;
35
+ color: var(--text-faint);
36
+ text-align: right;
37
+ }
38
+ .phase-mid { min-width: 0; }
39
+ .phase-id { font-family: var(--mono); font-size: 13px; color: var(--text); }
40
+ .phase-file {
41
+ font-family: var(--mono);
42
+ font-size: 11px;
43
+ color: var(--text-faint);
44
+ overflow-wrap: anywhere;
45
+ margin-top: 2px;
46
+ }
47
+ .phase-calls {
48
+ display: flex;
49
+ flex-wrap: wrap;
50
+ align-items: center;
51
+ gap: 4px;
52
+ margin-top: 6px;
53
+ }
54
+ .phase-calls-label { font-size: 11px; color: var(--text-faint); }
55
+ .phase-right {
56
+ display: flex;
57
+ flex-direction: column;
58
+ align-items: flex-end;
59
+ gap: 4px;
60
+ }
61
+ .phase-read,
62
+ .phase-layers { font-family: var(--mono); font-size: 11px; color: var(--text-faint); }
63
+ .phase-why {
64
+ grid-column: 1 / -1;
65
+ font-size: 12px;
66
+ color: var(--text-faint);
67
+ overflow-wrap: anywhere;
68
+ }
69
+
70
+ /* ── a call row ───────────────────────────────────────────────────────────────
71
+ Expands IN PLACE, one at a time (the Runs-row rule, v0.43.6). The head is a
72
+ FLEX row rather than a grid: its child count genuinely varies — `cost` is
73
+ optional — and a card whose child count changes with its state must not
74
+ declare its columns. */
75
+ .call-row {
76
+ border: 1px solid var(--line-soft);
77
+ border-radius: var(--radius-sm);
78
+ background: var(--surface-2);
79
+ margin-bottom: 4px;
80
+ overflow: hidden;
81
+ }
82
+ .call-head {
83
+ display: flex;
84
+ align-items: center;
85
+ gap: var(--sp-3);
86
+ width: 100%;
87
+ padding: var(--sp-2) var(--sp-3);
88
+ background: none;
89
+ border: 0;
90
+ color: inherit;
91
+ text-align: left;
92
+ cursor: pointer;
93
+ font: inherit;
94
+ }
95
+ .call-head:hover { background: var(--surface-3, var(--surface-2)); }
96
+ .call-caret {
97
+ color: var(--text-faint);
98
+ transition: transform 140ms ease;
99
+ flex: 0 0 auto;
100
+ }
101
+ .call-head[aria-expanded="true"] .call-caret { transform: rotate(90deg); }
102
+ .call-cmd {
103
+ font-family: var(--mono);
104
+ font-size: 12px;
105
+ color: var(--text);
106
+ flex: 1 1 auto;
107
+ min-width: 0;
108
+ overflow-wrap: anywhere;
109
+ }
110
+ .call-lanes-n { font-size: 11px; color: var(--text-faint); flex: 0 0 auto; }
111
+ .call-detail {
112
+ padding: 0 var(--sp-3) var(--sp-3) calc(var(--sp-3) + 20px);
113
+ border-top: 1px solid var(--line-soft);
114
+ }
115
+ .call-exits,
116
+ .call-lane-chips {
117
+ display: flex;
118
+ flex-wrap: wrap;
119
+ align-items: center;
120
+ gap: 4px;
121
+ margin-top: var(--sp-2);
122
+ }
123
+ .call-exits-label { font-size: 12px; color: var(--text-faint); }
124
+ /* An exit code is a CONTRACT a lane branches on, so it is drawn as a fixed
125
+ token rather than folded into the surrounding prose. */
126
+ .call-exit {
127
+ font-family: var(--mono);
128
+ font-size: 11px;
129
+ color: var(--text-dim);
130
+ background: var(--surface-1, var(--surface-2));
131
+ border: 1px solid var(--line-soft);
132
+ border-radius: var(--radius-sm);
133
+ padding: 2px 6px;
134
+ }
@@ -110,9 +110,9 @@
110
110
  to { transform: none; opacity: 1; }
111
111
  }
112
112
 
113
- /* THE SHADOWING ANIMATION (plan §6.2). Flip opus5_only on and the fable5_*
114
- rows desaturate, a lock slides in, and the reason is right there. The
115
- animation teaches the precedence rule — that is the whole point. */
113
+ /* THE SHADOWING ANIMATION (plan §6.2). A row a higher rank already answered
114
+ desaturates, a lock slides in, and the reason is right there. The animation
115
+ teaches the precedence rule — that is the whole point. */
116
116
  .setting.shadowed { opacity: .42; filter: saturate(.15); }
117
117
  .lock {
118
118
  display: inline-flex;
@@ -225,3 +225,79 @@
225
225
  .rung-bar { height: 4px; border-radius: 2px; background: var(--accent); opacity: .55; }
226
226
  .rung-agent { color: var(--text-dim); }
227
227
  .ladder-note { font-size: 12px; color: var(--text-faint); margin-top: var(--sp-2); }
228
+
229
+ /* ── who decides what: the contested families, resolved (v1.0.0 W16) ────────
230
+ A precedence LADDER, drawn the same way the score ladder above it is drawn
231
+ — one row per rank, in resolution order, top-down. The row that answered is
232
+ the only one given weight, because "read down and stop at the first one that
233
+ resolves" is a rule a picture can teach and a paragraph cannot. */
234
+ .rank-family { margin-top: var(--sp-4); }
235
+ .rank-family:first-of-type { margin-top: var(--sp-2); }
236
+ .rank-family-head {
237
+ display: flex;
238
+ flex-wrap: wrap;
239
+ align-items: baseline;
240
+ gap: var(--sp-2);
241
+ margin-bottom: 4px;
242
+ }
243
+ .rank-family-name { font-family: var(--mono); font-size: 12px; color: var(--text-dim); }
244
+ .rank-family-q { font-size: 12px; color: var(--text-faint); }
245
+ .rank-answer { font-size: 12px; color: var(--text-faint); margin-bottom: 6px; }
246
+
247
+ /* A GRID whose column count never changes with state. `.ex-tool`'s 250px
248
+ ellipse (v0.53.0) was a card DECLARING rows its states did not all have; the
249
+ `why` here is an optional FOURTH child, so it is given its own full-width
250
+ line rather than a column it sometimes leaves empty. */
251
+ .rank-row {
252
+ display: grid;
253
+ grid-template-columns: 34px minmax(0, 1fr) auto;
254
+ align-items: center;
255
+ gap: var(--sp-3);
256
+ padding: 5px var(--sp-3);
257
+ background: var(--surface-2);
258
+ border: 1px solid var(--line-soft);
259
+ border-radius: var(--radius-sm);
260
+ margin-bottom: 4px;
261
+ }
262
+ .rank-row.is-resolved { border-color: var(--ok); background: var(--ok-wash); }
263
+ .rank-prio { font-family: var(--mono); font-size: 12px; color: var(--text-faint); }
264
+ .rank-key { font-family: var(--mono); font-size: 12px; color: var(--text-dim); overflow-wrap: anywhere; }
265
+ /* The terminal floor is not a key and must not read as one, or somebody goes
266
+ looking for it in the config file. */
267
+ .rank-key.is-terminal { font-family: inherit; font-style: italic; color: var(--text-faint); }
268
+ .rank-why {
269
+ grid-column: 1 / -1;
270
+ font-size: 12px;
271
+ color: var(--text-faint);
272
+ overflow-wrap: anywhere;
273
+ }
274
+ .rank-legend {
275
+ display: flex;
276
+ flex-wrap: wrap;
277
+ align-items: center;
278
+ gap: 6px;
279
+ margin-top: var(--sp-3);
280
+ padding-top: var(--sp-3);
281
+ border-top: 1px solid var(--line-soft);
282
+ }
283
+ .rank-legend-label { font-size: 12px; color: var(--text-faint); }
284
+
285
+ /* which lanes read a key — chips, because the list is short and unordered */
286
+ .setting-lanes {
287
+ display: flex;
288
+ flex-wrap: wrap;
289
+ align-items: center;
290
+ gap: 4px;
291
+ margin-top: 6px;
292
+ }
293
+ .setting-lanes-label { font-size: 12px; color: var(--text-faint); }
294
+ .chip-lane {
295
+ font-family: var(--mono);
296
+ font-size: 11px;
297
+ color: var(--text-faint);
298
+ background: var(--surface-2);
299
+ border-color: var(--line-soft);
300
+ }
301
+ /* "no lane reads this" is an ANSWER, so it is styled as a stated fact rather
302
+ than as a missing chip. */
303
+ .setting-lanes-none { font-size: 11px; color: var(--text-faint); font-style: italic; }