@azure-id/orc 0.56.1 → 1.1.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 (162) hide show
  1. package/CHANGELOG.md +219 -0
  2. package/README-id.md +49 -107
  3. package/README.md +694 -719
  4. package/bin/build-agents.js +18 -11
  5. package/bin/cli.js +33699 -29855
  6. package/bin/onboarding-content.js +0 -3
  7. package/bin/test-run.js +491 -0
  8. package/bin/verify-contracts.js +4330 -3277
  9. package/bin/verify-package.js +76 -6
  10. package/bin/webui/api.js +1201 -1163
  11. package/bin/webui/app.html +210 -198
  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/css/panels/wait.css +123 -0
  17. package/bin/webui/fixtures/extra.js +2036 -1934
  18. package/bin/webui/fixtures/flow.js +2 -2
  19. package/bin/webui/fixtures/index.js +510 -486
  20. package/bin/webui/fixtures/lanes.js +218 -0
  21. package/bin/webui/fixtures/settings.js +261 -34
  22. package/bin/webui/fixtures/stats.js +3 -3
  23. package/bin/webui/fixtures/wait.js +97 -0
  24. package/bin/webui/i18n/TERMS.md +135 -134
  25. package/bin/webui/i18n/en/extra.json +345 -313
  26. package/bin/webui/i18n/en/lanes.json +29 -0
  27. package/bin/webui/i18n/en/nav.json +21 -19
  28. package/bin/webui/i18n/en/overview.json +2 -0
  29. package/bin/webui/i18n/en/settings.json +16 -5
  30. package/bin/webui/i18n/en/wait.json +41 -0
  31. package/bin/webui/i18n/id/extra.json +345 -313
  32. package/bin/webui/i18n/id/lanes.json +29 -0
  33. package/bin/webui/i18n/id/nav.json +21 -19
  34. package/bin/webui/i18n/id/overview.json +2 -0
  35. package/bin/webui/i18n/id/settings.json +15 -4
  36. package/bin/webui/i18n/id/wait.json +41 -0
  37. package/bin/webui/js/01-i18n.js +151 -149
  38. package/bin/webui/js/panels/extra.js +3199 -3011
  39. package/bin/webui/js/panels/lanes.js +259 -0
  40. package/bin/webui/js/panels/overview.js +10 -0
  41. package/bin/webui/js/panels/settings.js +149 -3
  42. package/bin/webui/js/panels/wait.js +253 -0
  43. package/package.json +39 -39
  44. package/templates/agents/MODEL-MAPPING.md +23 -35
  45. package/templates/agents/orc-executor-opus-4-7-high.md +1 -1
  46. package/templates/agents/orc-executor-opus-4-7-med.md +1 -1
  47. package/templates/agents/orc-executor-opus-4-8-high.md +1 -1
  48. package/templates/agents/orc-executor-opus-5-high.md +1 -1
  49. package/templates/agents/orc-executor-opus-5-low.md +1 -1
  50. package/templates/agents/orc-executor-opus-5-med.md +1 -1
  51. package/templates/agents/orc-retro-opus-5-med.md +73 -73
  52. package/templates/agents/orc-retro-sonnet-5-high.md +72 -72
  53. package/templates/agents/orc-trace-writer-haiku-4-5.md +107 -107
  54. package/templates/commands/orc-route.md +1 -1
  55. package/templates/commands/orc-wait.md +19 -0
  56. package/templates/commands/orc.md +1 -1
  57. package/templates/hooks/orc-statusline.js +39 -0
  58. package/templates/skills/_shared/README.md +7 -3
  59. package/templates/skills/_shared/config-precedence.md +198 -0
  60. package/templates/skills/_shared/drift-recovery.md +1 -1
  61. package/templates/skills/_shared/extra-dispatch.md +159 -7
  62. package/templates/skills/_shared/interview.md +1 -1
  63. package/templates/skills/_shared/opus5-only.md +9 -7
  64. package/templates/skills/_shared/phases/README.md +82 -0
  65. package/templates/skills/{orc/references → _shared/phases}/analyst-gates.md +15 -3
  66. package/templates/skills/_shared/phases/execution.md +143 -0
  67. package/templates/skills/{orc/references → _shared/phases}/house-rules.md +13 -1
  68. package/templates/skills/{orc/references → _shared/phases}/intake.md +15 -2
  69. package/templates/skills/_shared/phases/mock-example.md +56 -0
  70. package/templates/skills/{orc/references → _shared/phases}/plan-handoff.md +16 -3
  71. package/templates/skills/_shared/phases/planning.md +135 -0
  72. package/templates/skills/_shared/phases/preflight.md +98 -0
  73. package/templates/skills/_shared/phases/review.md +53 -0
  74. package/templates/skills/_shared/phases/scoring.md +65 -0
  75. package/templates/skills/{orc/references → _shared/phases}/security-checklist.md +12 -1
  76. package/templates/skills/_shared/phases/security.md +55 -0
  77. package/templates/skills/_shared/phases/ship.md +88 -0
  78. package/templates/skills/{orc/references/stop-and-resume.md → _shared/phases/stop-resume.md} +169 -160
  79. package/templates/skills/_shared/phases/summary.md +48 -0
  80. package/templates/skills/_shared/phases/testgen.md +51 -0
  81. package/templates/skills/{orc/references/trace-protocol.md → _shared/phases/trace.md} +49 -6
  82. package/templates/skills/_shared/phases/verify.md +70 -0
  83. package/templates/skills/{orc/references → _shared/phases}/wave-grouping.md +14 -2
  84. package/templates/skills/{orc/references → _shared/phases}/wiki-consult.md +13 -1
  85. package/templates/skills/_shared/read-ladder.md +48 -0
  86. package/templates/skills/_shared/wait.md +240 -0
  87. package/templates/skills/context-combiner/SKILL.md +214 -187
  88. package/templates/skills/orc/README.md +148 -150
  89. package/templates/skills/orc/SKILL.md +75 -358
  90. package/templates/skills/orc/config.md +137 -389
  91. package/templates/skills/orc/examples/full-run-mock.md +1 -1
  92. package/templates/skills/orc/references/effort-and-mode.md +16 -18
  93. package/templates/skills/orc/references/phases/intake.md +47 -0
  94. package/templates/skills/orc/references/phases/integration.md +19 -0
  95. package/templates/skills/orc/references/preflight-report.md +4 -4
  96. package/templates/skills/orc/references/ultra-mode.md +117 -123
  97. package/templates/skills/orc/schemas/planning-output.md +279 -279
  98. package/templates/skills/orc/subskills/orc-planner/SKILL.md +260 -264
  99. package/templates/skills/orc/subskills/orc-pr/stack-gate.md +4 -1
  100. package/templates/skills/orc-aftermath/SKILL.md +158 -136
  101. package/templates/skills/orc-analyze/SKILL.md +252 -220
  102. package/templates/skills/orc-analyze/references/branching.md +51 -51
  103. package/templates/skills/orc-analyze/references/thin-input.md +1 -1
  104. package/templates/skills/orc-analyze-mini/SKILL.md +128 -112
  105. package/templates/skills/orc-boundary/SKILL.md +249 -208
  106. package/templates/skills/orc-brainstorm/SKILL.md +377 -339
  107. package/templates/skills/orc-budget/SKILL.md +248 -225
  108. package/templates/skills/orc-challenge/README.md +1 -1
  109. package/templates/skills/orc-challenge/SKILL.md +298 -255
  110. package/templates/skills/orc-challenge/examples/council-full-roster.md +1 -1
  111. package/templates/skills/orc-claude/SKILL.md +221 -199
  112. package/templates/skills/orc-diy/README.md +2 -1
  113. package/templates/skills/orc-diy/SKILL.md +132 -68
  114. package/templates/skills/orc-diy/references/blocks/analyze.md +1 -1
  115. package/templates/skills/orc-diy/references/compile.md +21 -7
  116. package/templates/skills/orc-diy/references/flow-schema.md +2 -2
  117. package/templates/skills/orc-doc/SKILL.md +49 -7
  118. package/templates/skills/orc-explain/SKILL.md +24 -0
  119. package/templates/skills/orc-export/SKILL.md +31 -5
  120. package/templates/skills/orc-fast/SKILL.md +218 -185
  121. package/templates/skills/orc-grill/SKILL.md +238 -207
  122. package/templates/skills/orc-handoff/SKILL.md +223 -204
  123. package/templates/skills/orc-learn/SKILL.md +181 -156
  124. package/templates/skills/orc-mini/SKILL.md +47 -24
  125. package/templates/skills/orc-pact/SKILL.md +255 -218
  126. package/templates/skills/orc-pattern/SKILL.md +154 -124
  127. package/templates/skills/orc-poly/SKILL.md +242 -216
  128. package/templates/skills/orc-poly/references/gather.md +1 -1
  129. package/templates/skills/orc-pr-driver/SKILL.md +196 -167
  130. package/templates/skills/orc-pr-driver/references/orc-run-split.md +1 -1
  131. package/templates/skills/orc-pr-setup/SKILL.md +212 -184
  132. package/templates/skills/orc-quick/README.md +2 -2
  133. package/templates/skills/orc-quick/SKILL.md +51 -13
  134. package/templates/skills/orc-quick/references/dispatch-gate.md +2 -3
  135. package/templates/skills/orc-retro/SKILL.md +249 -222
  136. package/templates/skills/orc-retro/examples/retro-mock.md +171 -171
  137. package/templates/skills/orc-route/SKILL.md +188 -165
  138. package/templates/skills/orc-verify/SKILL.md +103 -84
  139. package/templates/skills/orc-wait/SKILL.md +163 -0
  140. package/templates/skills/orc-wiki/SKILL.md +60 -206
  141. package/templates/skills/orc-wiki/references/phases/phase-0.md +71 -0
  142. package/templates/skills/orc-wiki/references/phases/phase-1.md +35 -0
  143. package/templates/skills/orc-wiki/references/phases/phase-2.md +52 -0
  144. package/templates/skills/orc-wiki/references/phases/phase-3.md +57 -0
  145. package/templates/skills/orc-wiki/references/phases/phase-3c.md +36 -0
  146. package/templates/agents/orc-advisor-fable-5.md +0 -50
  147. package/templates/agents/orc-analyst-fable-5.md +0 -115
  148. package/templates/agents/orc-judge-fable-5.md +0 -79
  149. package/templates/agents/orc-planner-fable-5.md +0 -152
  150. package/templates/agents/orc-reviewer-fable-5.md +0 -57
  151. package/templates/skills/_shared/fable5-override.md +0 -56
  152. package/templates/skills/orc-diy/references/blocks/execution.md +0 -42
  153. package/templates/skills/orc-diy/references/blocks/mock-example.md +0 -22
  154. package/templates/skills/orc-diy/references/blocks/planning.md +0 -34
  155. package/templates/skills/orc-diy/references/blocks/review.md +0 -18
  156. package/templates/skills/orc-diy/references/blocks/scoring.md +0 -16
  157. package/templates/skills/orc-diy/references/blocks/security.md +0 -25
  158. package/templates/skills/orc-diy/references/blocks/ship.md +0 -25
  159. package/templates/skills/orc-diy/references/blocks/summary.md +0 -18
  160. package/templates/skills/orc-diy/references/blocks/testgen.md +0 -17
  161. package/templates/skills/orc-diy/references/blocks/trace.md +0 -28
  162. package/templates/skills/orc-diy/references/blocks/verify.md +0 -25
@@ -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; }
@@ -0,0 +1,123 @@
1
+ /* wait.css — the usage window and the wait.
2
+ Loaded from app.html in manifest order; every colour here is a token from
3
+ 00-tokens.css, defined once on bare :root. */
4
+
5
+ /* The window rows. A FLEX COLUMN, not a declared grid: the card's child count
6
+ changes with its state (unknown has no bars at all), and a card whose child
7
+ count changes must not declare its rows — that is the `.ex-tool` 250px
8
+ ellipse, and it hit whichever card had the shortest content. */
9
+ .wait-windows {
10
+ display: flex;
11
+ flex-direction: column;
12
+ gap: 10px;
13
+ margin: 10px 0;
14
+ }
15
+
16
+ .wait-win {
17
+ display: flex;
18
+ align-items: center;
19
+ gap: 10px;
20
+ }
21
+
22
+ .wait-win-label {
23
+ flex: 0 0 2.5rem;
24
+ font-size: 12px;
25
+ color: var(--text-dim);
26
+ }
27
+
28
+ /* THE BAR IS A WIDTH INSIDE THE ROW. A proportional bar that shares the row
29
+ with a min-width floor ends up fighting it, and something gets clipped. */
30
+ .wait-bar-wrap {
31
+ flex: 1 1 auto;
32
+ min-width: 0;
33
+ display: flex;
34
+ align-items: center;
35
+ gap: 10px;
36
+ }
37
+
38
+ .wait-bar {
39
+ flex: 1 1 auto;
40
+ min-width: 0;
41
+ height: 8px;
42
+ border-radius: 4px;
43
+ background: var(--surface-2);
44
+ overflow: hidden;
45
+ }
46
+
47
+ .wait-bar-fill {
48
+ height: 100%;
49
+ background: var(--accent);
50
+ border-radius: 4px;
51
+ }
52
+
53
+ .wait-bar.low .wait-bar-fill {
54
+ background: var(--warn);
55
+ }
56
+
57
+ .wait-bar-text {
58
+ flex: 0 0 auto;
59
+ font-size: 12px;
60
+ color: var(--text-dim);
61
+ font-variant-numeric: tabular-nums;
62
+ white-space: nowrap;
63
+ }
64
+
65
+ /* The block. It is a standing decision with a reason, so it reads as a quoted
66
+ record rather than as an error. */
67
+ .wait-block {
68
+ margin-top: 12px;
69
+ padding: 10px 12px;
70
+ border-left: 3px solid var(--warn);
71
+ background: var(--surface-2);
72
+ border-radius: 0 6px 6px 0;
73
+ }
74
+
75
+ .wait-block-head {
76
+ font-size: 12px;
77
+ font-weight: 600;
78
+ color: var(--text-dim);
79
+ margin-bottom: 4px;
80
+ }
81
+
82
+ /* VERBATIM, and it can be long — a reason nobody can read is not a record. */
83
+ .wait-block-reason {
84
+ font-size: 13px;
85
+ line-height: 1.5;
86
+ overflow-wrap: anywhere;
87
+ }
88
+
89
+ /* The lane table. Every row keeps its slot, including `none`. */
90
+ .wait-lanes {
91
+ display: flex;
92
+ flex-direction: column;
93
+ gap: 8px;
94
+ margin: 10px 0;
95
+ }
96
+
97
+ .wait-lane {
98
+ display: flex;
99
+ flex-wrap: wrap;
100
+ align-items: center;
101
+ gap: 8px;
102
+ padding: 8px 0;
103
+ border-bottom: 1px solid var(--line-soft);
104
+ }
105
+
106
+ .wait-lane:last-child {
107
+ border-bottom: 0;
108
+ }
109
+
110
+ .wait-lane-name {
111
+ flex: 0 0 10rem;
112
+ font-size: 12px;
113
+ }
114
+
115
+ .wait-lane-safe {
116
+ font-size: 12px;
117
+ color: var(--text-dim);
118
+ }
119
+
120
+ .wait-lane-detail {
121
+ flex: 1 1 100%;
122
+ margin: 0;
123
+ }