@orkestrel/scaffold 0.0.18 → 0.0.19

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 (65) hide show
  1. package/dist/host/AGENTS.md +4 -2
  2. package/dist/host/CLAUDE.md +22 -10
  3. package/dist/host/agents/skills/enterprise-bootstrap/SKILL.md +267 -0
  4. package/dist/host/agents/skills/enterprise-bootstrap/agents/openai.yaml +4 -0
  5. package/dist/host/agents/skills/enterprise-bootstrap/references/bootstrap-reference.md +609 -0
  6. package/dist/host/agents/skills/enterprise-bootstrap/references/components.md +994 -0
  7. package/dist/host/agents/skills/enterprise-bootstrap/references/frontend-design.md +59 -0
  8. package/dist/host/agents/skills/enterprise-bootstrap/references/utilities.md +312 -0
  9. package/dist/host/agents/skills/orkestrel-align-packages/references/integration.md +4 -13
  10. package/dist/host/agents/skills/orkestrel-build-application/SKILL.md +78 -50
  11. package/dist/host/agents/skills/orkestrel-debrief/SKILL.md +81 -0
  12. package/dist/host/agents/skills/orkestrel-debrief/agents/openai.yaml +4 -0
  13. package/dist/host/agents/skills/orkestrel-debrief/references/field-testing.md +75 -0
  14. package/dist/host/agents/skills/orkestrel-harden-package/SKILL.md +11 -9
  15. package/dist/host/agents/skills/orkestrel-harden-package/references/centralization.md +44 -59
  16. package/dist/host/agents/skills/orkestrel-harden-package/references/hardening.md +14 -6
  17. package/dist/host/agents/skills/orkestrel-polish-surface/SKILL.md +113 -0
  18. package/dist/host/agents/skills/orkestrel-polish-surface/agents/openai.yaml +4 -0
  19. package/dist/host/agents/skills/orkestrel-polish-surface/references/capture-harness.md +82 -0
  20. package/dist/host/claude/agents/builder.md +2 -0
  21. package/dist/host/claude/agents/codex.md +33 -26
  22. package/dist/host/claude/agents/grok.md +7 -0
  23. package/dist/host/claude/agents/implementer.md +2 -1
  24. package/dist/host/claude/agents/orkestrel.md +20 -15
  25. package/dist/host/claude/agents/planner.md +2 -1
  26. package/dist/host/claude/agents/reviewer.md +6 -0
  27. package/dist/host/claude/rules/documentation.md +1 -0
  28. package/dist/host/claude/rules/names.md +5 -7
  29. package/dist/host/claude/rules/quality.md +7 -5
  30. package/dist/host/claude/rules/styles.md +1 -0
  31. package/dist/host/claude/rules/tests.md +1 -0
  32. package/dist/host/claude/rules/typescript.md +3 -10
  33. package/dist/host/claude/rules/workspace.md +2 -5
  34. package/dist/host/claude/skills/enterprise-bootstrap/SKILL.md +12 -0
  35. package/dist/host/claude/skills/orkestrel-debrief/SKILL.md +12 -0
  36. package/dist/host/claude/skills/orkestrel-polish-surface/SKILL.md +12 -0
  37. package/dist/host/codex/agents/analyst.toml +6 -3
  38. package/dist/host/codex/agents/builder.toml +3 -2
  39. package/dist/host/codex/agents/checker.toml +4 -2
  40. package/dist/host/codex/agents/grok.toml +3 -1
  41. package/dist/host/codex/agents/implementer.toml +4 -2
  42. package/dist/host/codex/agents/opus.toml +5 -3
  43. package/dist/host/codex/agents/orkestrel.toml +6 -5
  44. package/dist/host/codex/agents/planner.toml +6 -2
  45. package/dist/host/codex/agents/reviewer.toml +7 -2
  46. package/dist/host/codex/config.toml +11 -2
  47. package/dist/host/dotfiles/prettierignore +3 -0
  48. package/dist/host/guides/src/scaffold.md +42 -12
  49. package/dist/host/manifest.json +80 -9
  50. package/dist/src/core/index.cjs +162 -14
  51. package/dist/src/core/index.cjs.map +1 -1
  52. package/dist/src/core/index.d.cts +17 -6
  53. package/dist/src/core/index.d.ts +17 -6
  54. package/dist/src/core/index.js +162 -15
  55. package/dist/src/core/index.js.map +1 -1
  56. package/dist/src/server/index.cjs +9 -3
  57. package/dist/src/server/index.cjs.map +1 -1
  58. package/dist/src/server/index.d.cts +2 -1
  59. package/dist/src/server/index.d.ts +2 -1
  60. package/dist/src/server/index.js +10 -4
  61. package/dist/src/server/index.js.map +1 -1
  62. package/package.json +1 -1
  63. package/dist/host/agents/skills/orkestrel-build-application/references/application.md +0 -129
  64. package/dist/host/claude/agents/application.md +0 -30
  65. package/dist/host/codex/agents/application.toml +0 -25
@@ -0,0 +1,59 @@
1
+ # Frontend Design
2
+
3
+ > Part of the `enterprise-bootstrap` package. Full aesthetic, typography,
4
+ > process, and copy guidance — use when setting visual direction.
5
+ > Operate layer: [SKILL.md](../SKILL.md).
6
+
7
+ Approach this as the design lead at a small studio known for giving every client a visual identity that could not be mistaken for anyone else's. This client has already rejected proposals that felt templated, and is paying for a distinctive point of view: make deliberate, opinionated choices about palette, typography, and layout that are specific to this brief, and take one real aesthetic risk you can justify.
8
+
9
+ ## Ground it in the subject
10
+
11
+ If the brief does not pin down what the product or subject is, pin it yourself before designing: name one concrete subject, its audience, and the page's single job, and state your choice. If there's any information in your memory about the human's preferences, context about what they're building, or designs you've made before — use that as a hint. The subject's own world, its materials, instruments, artifacts, and vernacular, is where distinctive choices come from. Build with the brief's real content and subject matter throughout.
12
+
13
+ ## Design principles
14
+
15
+ For web designs, the hero is a thesis. Open with the most characteristic thing in the subject's world, in whatever form makes sense for it: a headline, an image, an animation, a live demo, an interactive moment. Be deliberate with your choice: a big number with a small label, supporting stats, and a gradient accent is the template answer — only use it if that's truly the best option.
16
+
17
+ Typography carries the personality of the page. Pair the display and body faces deliberately, not the same families you would reach for on any other project, and set a clear type scale with intentional weights, widths, and spacing. Make the type treatment itself a memorable part of the design, not a neutral delivery vehicle for the content.
18
+
19
+ Structure is information. Structural devices — numbering, eyebrows, dividers, labels — should encode something true about the content, not decorate it. Many generic designs use numbered markers (01 / 02 / 03), but that's only appropriate if the content actually is a sequence, like a real process or a typed timeline where order carries information the reader needs. Question whether choices like numbered markers actually make sense before incorporating them.
20
+
21
+ Leverage motion deliberately. Think about where and whether animation can serve the subject: a page-load sequence, a scroll-triggered reveal, hover micro-interactions, ambient atmosphere. An orchestrated moment usually lands harder than scattered effects; choose what the direction calls for. Sometimes less is more — extra animation is one of the fastest ways to make a design feel AI-generated.
22
+
23
+ Match complexity to the vision. Maximalist directions need elaborate execution; minimal directions need precision in spacing, type, and detail. Elegance is executing the chosen vision well.
24
+
25
+ Consider written content carefully. A design brief often contains no real content, and it's up to you to come up with copy. Copy can make a design feel as templated as the layout itself. See the writing section below.
26
+
27
+ ## Where the signature lives in product UI
28
+
29
+ The same craft applies to dense, authenticated tools — but the signature moves. In an admin screen or dashboard, the data is the content and must stay quiet, legible, and fast to scan; spending the aesthetic risk on the table itself taxes every user on every visit. Put the point of view in the chrome instead: the navigation and header treatment, the type pairing, the empty states, the way status and density are handled. A distinctive product UI is one whose _frame_ could not be mistaken for another product while its data surfaces stay disciplined and conventional enough to disappear into use.
30
+
31
+ ## Process: brainstorm, explore, plan, critique, build, critique again
32
+
33
+ For calibration: AI-generated design right now clusters around three looks: (1) a warm cream background (near #F4F1EA) with a high-contrast serif display and a terracotta accent; (2) a near-black background with a single bright acid-green or vermilion accent; (3) a broadsheet-style layout with hairline rules, zero border-radius, and dense newspaper-like columns. All three are legitimate for some briefs, but they are defaults rather than choices, and they appear regardless of subject. Where the brief pins down a visual direction, follow it exactly — the brief's own words always win, including when it asks for one of these looks. Where it leaves an axis free, don't spend that freedom on one of these defaults. Just like a hired human designer, there's a careful balance between doing what you're good at and taking each project as a chance to experiment and learn.
34
+
35
+ Work in two passes. First, brainstorm a short design plan based on the human's design brief: create a compact token system with color, type, layout, and signature. Color: describe the palette as 4–6 named hex values. Type: the typefaces for 2+ roles (a characterful display face used with restraint, a complementary body face, and a utility face for captions or data if needed). Layout: a layout concept, using one-sentence prose descriptions and ASCII wireframes to ideate and compare. Signature: the single unique element this page will be remembered by, embodying the brief in an appropriate way.
36
+
37
+ Then review that plan against the brief before building: if any part of it reads like the generic default you would produce for any similar page (work through a similar prompt to see if you arrive somewhere similar) rather than a choice made for this specific brief — revise that part, and say what you changed and why. Only after you've confirmed the relative uniqueness of your design plan should you start to write the code, following the revised plan exactly and deriving every color and type decision from it.
38
+
39
+ When writing the code, be careful structuring your CSS selector specificities. It's easy to generate classes that cancel each other out (especially a type-based selector like `.section` against an element-based selector like `.cta`), and paddings/margins between sections are where it happens most.
40
+
41
+ Do a lot of this planning and iteration in your thinking, and only show ideas to the user when you have higher confidence they'll delight.
42
+
43
+ ## Restraint and self-critique
44
+
45
+ Spend your boldness in one place. Let the signature element be the one memorable thing, keep everything around it quiet and disciplined, and cut any decoration that does not serve the brief. Not taking a risk can be a risk itself! Build to a quality floor without announcing it: responsive down to mobile, visible keyboard focus, reduced motion respected. Critique your own work as you build, taking screenshots if your environment supports it — a picture is worth 1000 tokens, and it is the only thing that can tell you whether the design you wrote is the design that rendered. Look at both themes and both the wide and the narrow viewport; a treatment that only exists in the markup is not a treatment yet. Consider Chanel's advice: before leaving the house, look in the mirror and remove one accessory. Human creators have memory and always try to do something new; if you have a place to jot down notes about what you've tried, it will help future passes.
46
+
47
+ ## More on writing in design
48
+
49
+ Words appear in a design for one reason: to make it easier to understand, and therefore easier to use. They are design material, not decoration. Bring the same intentionality to copy that you bring to spacing and color. Before writing anything, ask what the design needs to say, and how it can best be said to help the person navigate the experience.
50
+
51
+ Write from the end user's side of the screen. Name things by what people control and recognize, never by how the system is built. A person manages notifications, not webhook config. Describe what something does in plain terms rather than selling it. Being specific is always better than being clever.
52
+
53
+ Use active voice as default. A control should say exactly what happens when it's used: "Save changes," not "Submit." An action keeps the same name through the whole flow, so the button that says "Publish" produces a toast that says "Published." The vocabulary of an interface is the signposting for someone navigating the product. Cohesion and consistency are how people learn their way around.
54
+
55
+ Treat failure and emptiness as moments for direction, not mood. Explain what went wrong and how to fix it, in the interface's voice rather than a person's. Errors don't apologize, and they are never vague about what happened. An empty screen is an invitation to act.
56
+
57
+ Keep the register conversational and tuned: plain verbs, sentence case, no filler, with tone matched to the brand and the audience. Let each element do exactly one job. A label labels, an example demonstrates, and nothing quietly does double duty.
58
+
59
+ Brevity on a control is not the same as vagueness. Where the surrounding context already names the object, the visible label can be a single word and stay unambiguous — the specific phrase then lives in the control's accessible name, so nothing is lost for someone who arrives without the context. The same discipline governs the visual vocabulary: a glyph is a word, and a word means one thing. Once a mark stands for "finished" it cannot also stand for "selected" three panels over, or the reader has to relearn the language on every screen.
@@ -0,0 +1,312 @@
1
+ # Bootstrap 5 Utilities Reference
2
+
3
+ > Part of the `enterprise-bootstrap` package. Bootstrap **5.3.x** class index +
4
+ > composition notes. Component markup: [components.md](components.md).
5
+ > Theming, patterns, a11y: [bootstrap-reference.md](bootstrap-reference.md).
6
+
7
+ ## Contents
8
+
9
+ - [Utility classes](#utility-classes-quick-reference) — background, borders, text color, display, flexbox, float, interactions, links, object fit, opacity, overflow, position, shadows, sizing, spacing, text, vertical align, visibility, z-index
10
+ - [Scales](#spacing-scale) — spacing scale, z-index component scale
11
+ - [Print utilities](#print-utilities)
12
+ - [Helpers](#helpers) — visually-hidden, stretched-link, ratio, stacks, vr, focus-ring, icon-link
13
+ - [Enterprise notes](#enterprise-notes-utilities) — composition habits
14
+
15
+ ## Utility Classes Quick Reference
16
+
17
+ ### Background
18
+
19
+ ```css
20
+ .bg-primary, .bg-secondary, .bg-success, .bg-danger, .bg-warning, .bg-info, .bg-light, .bg-dark, .bg-body, .bg-white, .bg-transparent, .bg-black
21
+ .bg-body-secondary, .bg-body-tertiary
22
+ .bg-primary-subtle, .bg-secondary-subtle, .bg-success-subtle, .bg-danger-subtle, .bg-warning-subtle, .bg-info-subtle, .bg-light-subtle, .bg-dark-subtle
23
+ .bg-gradient
24
+ .bg-opacity-10, .bg-opacity-25, .bg-opacity-50, .bg-opacity-75, .bg-opacity-100
25
+ ```
26
+
27
+ Prefer `bg-body-*` and `*-subtle` over `bg-white`/`bg-light` — they track `data-bs-theme` so dark mode works without extra rules.
28
+
29
+ ### Borders
30
+
31
+ ```css
32
+ .border, .border-top, .border-end, .border-bottom, .border-start
33
+ .border-0, .border-top-0, .border-end-0, .border-bottom-0, .border-start-0
34
+ .border-1, .border-2, .border-3, .border-4, .border-5 /* widths */
35
+ .border-primary, .border-secondary, .border-success, .border-danger, .border-warning, .border-info, .border-light, .border-dark, .border-white, .border-black
36
+ .border-primary-subtle, .border-secondary-subtle, .border-success-subtle, .border-danger-subtle, .border-warning-subtle, .border-info-subtle, .border-light-subtle, .border-dark-subtle
37
+ .border-opacity-10, .border-opacity-25, .border-opacity-50, .border-opacity-75, .border-opacity-100
38
+ .rounded, .rounded-top, .rounded-end, .rounded-bottom, .rounded-start, .rounded-circle, .rounded-pill
39
+ .rounded-0, .rounded-1, .rounded-2, .rounded-3, .rounded-4, .rounded-5
40
+ ```
41
+
42
+ For borders that must stay visible in both color modes, prefer `border-*-subtle` variants (theme-adaptive) over raw color borders.
43
+
44
+ ### Colors (Text)
45
+
46
+ ```css
47
+ .text-primary, .text-secondary, .text-success, .text-danger, .text-warning, .text-info, .text-light, .text-dark
48
+ .text-body, .text-body-secondary, .text-body-tertiary, .text-body-emphasis
49
+ .text-primary-emphasis, .text-secondary-emphasis, .text-success-emphasis, .text-danger-emphasis, .text-warning-emphasis, .text-info-emphasis, .text-light-emphasis, .text-dark-emphasis
50
+ .text-black, .text-white, .text-black-50, .text-white-50
51
+ .text-muted /* DEPRECATED in 5.3 — use .text-body-secondary; removed in v6 */
52
+ .text-opacity-25, .text-opacity-50, .text-opacity-75, .text-opacity-100
53
+ ```
54
+
55
+ ### Display
56
+
57
+ ```css
58
+ .d-none, .d-inline, .d-inline-block, .d-block, .d-grid, .d-inline-grid, .d-table, .d-table-cell, .d-table-row, .d-flex, .d-inline-flex
59
+ .d-{breakpoint}-none, .d-{breakpoint}-inline, .d-{breakpoint}-inline-block, .d-{breakpoint}-block, .d-{breakpoint}-grid, .d-{breakpoint}-inline-grid, .d-{breakpoint}-table, .d-{breakpoint}-table-cell, .d-{breakpoint}-table-row, .d-{breakpoint}-flex, .d-{breakpoint}-inline-flex
60
+ ```
61
+
62
+ ### Flexbox
63
+
64
+ ```css
65
+ /* Direction */
66
+ .flex-row, .flex-column, .flex-row-reverse, .flex-column-reverse
67
+ .flex-{breakpoint}-row, .flex-{breakpoint}-column, .flex-{breakpoint}-row-reverse, .flex-{breakpoint}-column-reverse
68
+
69
+ /* Justify Content */
70
+ .justify-content-start, .justify-content-end, .justify-content-center, .justify-content-between, .justify-content-around, .justify-content-evenly
71
+ .justify-content-{breakpoint}-start, .justify-content-{breakpoint}-end, .justify-content-{breakpoint}-center, .justify-content-{breakpoint}-between, .justify-content-{breakpoint}-around, .justify-content-{breakpoint}-evenly
72
+
73
+ /* Align Items */
74
+ .align-items-start, .align-items-end, .align-items-center, .align-items-baseline, .align-items-stretch
75
+ .align-items-{breakpoint}-start, .align-items-{breakpoint}-end, .align-items-{breakpoint}-center, .align-items-{breakpoint}-baseline, .align-items-{breakpoint}-stretch
76
+
77
+ /* Align Self */
78
+ .align-self-start, .align-self-end, .align-self-center, .align-self-baseline, .align-self-stretch
79
+
80
+ /* Fill */
81
+ .flex-fill, .flex-{breakpoint}-fill
82
+
83
+ /* Grow/Shrink */
84
+ .flex-grow-0, .flex-grow-1, .flex-shrink-0, .flex-shrink-1
85
+
86
+ /* Wrap */
87
+ .flex-wrap, .flex-nowrap, .flex-wrap-reverse
88
+
89
+ /* Order */
90
+ .order-first, .order-0, .order-1, .order-2, .order-3, .order-4, .order-5, .order-last
91
+
92
+ /* Align Content */
93
+ .align-content-start, .align-content-end, .align-content-center, .align-content-between, .align-content-around, .align-content-stretch
94
+ ```
95
+
96
+ ### Float
97
+
98
+ ```css
99
+ .float-start, .float-end, .float-none
100
+ .float-{breakpoint}-start, .float-{breakpoint}-end, .float-{breakpoint}-none
101
+ ```
102
+
103
+ ### Interactions
104
+
105
+ ```css
106
+ .user-select-all, .user-select-auto, .user-select-none
107
+ .pe-none, .pe-auto /* pointer-events */
108
+ ```
109
+
110
+ `.pe-none` blocks pointer input only — keyboard and assistive tech can still reach the element. Pair with `tabindex="-1"` and `aria-disabled="true"`, or better, use the real `disabled` attribute on form controls and drop `href` on links.
111
+
112
+ ### Link
113
+
114
+ ```css
115
+ .link-primary, .link-secondary, .link-success, .link-danger, .link-warning, .link-info, .link-light, .link-dark
116
+ .link-body-emphasis
117
+ .link-opacity-10, .link-opacity-25, .link-opacity-50, .link-opacity-75, .link-opacity-100
118
+ .link-underline, .link-underline-primary (…per theme color)
119
+ .link-underline-opacity-0, .link-underline-opacity-10, .link-underline-opacity-25, .link-underline-opacity-50, .link-underline-opacity-75, .link-underline-opacity-100
120
+ .link-offset-1, .link-offset-2, .link-offset-3
121
+ ```
122
+
123
+ ### Object Fit
124
+
125
+ ```css
126
+ .object-fit-contain, .object-fit-cover, .object-fit-fill, .object-fit-scale, .object-fit-none
127
+ .object-fit-{breakpoint}-contain, .object-fit-{breakpoint}-cover, .object-fit-{breakpoint}-fill, .object-fit-{breakpoint}-scale, .object-fit-{breakpoint}-none
128
+ ```
129
+
130
+ ### Opacity
131
+
132
+ ```css
133
+ .opacity-0, .opacity-25, .opacity-50, .opacity-75, .opacity-100
134
+ ```
135
+
136
+ ### Overflow
137
+
138
+ ```css
139
+ .overflow-auto, .overflow-hidden, .overflow-visible, .overflow-scroll
140
+ .overflow-x-auto, .overflow-x-hidden, .overflow-x-visible, .overflow-x-scroll
141
+ .overflow-y-auto, .overflow-y-hidden, .overflow-y-visible, .overflow-y-scroll
142
+ ```
143
+
144
+ ### Position
145
+
146
+ ```css
147
+ .position-static, .position-relative, .position-absolute, .position-fixed, .position-sticky
148
+ .fixed-top, .fixed-bottom
149
+ .sticky-top, .sticky-bottom
150
+ .top-0, .top-50, .top-100
151
+ .bottom-0, .bottom-50, .bottom-100
152
+ .start-0, .start-50, .start-100
153
+ .end-0, .end-50, .end-100
154
+ .translate-middle, .translate-middle-x, .translate-middle-y
155
+ ```
156
+
157
+ ### Shadows
158
+
159
+ ```css
160
+ .shadow-none, .shadow-sm, .shadow, .shadow-lg
161
+ ```
162
+
163
+ ### Sizing
164
+
165
+ Bootstrap ships exactly these — nothing else (no `.vw-25`, `.vh-50`, `.mw-auto`, `.min-vh-75`, etc.; add missing steps via the utilities API if a project truly needs them — see [bootstrap-reference.md](bootstrap-reference.md)):
166
+
167
+ ```css
168
+ /* Width / height (percent of parent) */
169
+ .w-25, .w-50, .w-75, .w-100, .w-auto
170
+ .h-25, .h-50, .h-75, .h-100, .h-auto
171
+
172
+ /* Max */
173
+ .mw-100, .mh-100
174
+
175
+ /* Viewport */
176
+ .vw-100, .vh-100, .min-vw-100, .min-vh-100
177
+ ```
178
+
179
+ ### Spacing
180
+
181
+ ```css
182
+ /* Format: {property}{sides}-{size} or {property}{sides}-{breakpoint}-{size} */
183
+ /* Property: m (margin), p (padding) */
184
+ /* Sides: t, b, s (start), e (end), x, y, (blank) */
185
+ /* Size: 0, 1, 2, 3, 4, 5, auto (margins only) */
186
+
187
+ .m-0 … .m-5, .m-auto .mt-* .mb-* .ms-* .me-* .mx-* .my-* (same sizes, + auto)
188
+ .p-0 … .p-5 .pt-* .pb-* .ps-* .pe-* .px-* .py-* (same sizes)
189
+
190
+ /* Gap — flex and grid parents */
191
+ .gap-0 … .gap-5
192
+ .row-gap-0 … .row-gap-5
193
+ .column-gap-0 … .column-gap-5
194
+ ```
195
+
196
+ Notes: `s`/`e` are logical start/end — they flip automatically under RTL; never reach for physical left/right. `.g-*` / `.gx-*` / `.gy-*` are **row gutters** (used on `.row`), a separate system from `gap-*`. Negative margins exist in source but are disabled by default (`$enable-negative-margins`).
197
+
198
+ ### Text
199
+
200
+ ```css
201
+ /* Alignment */
202
+ .text-start, .text-center, .text-end
203
+ .text-{breakpoint}-start, .text-{breakpoint}-center, .text-{breakpoint}-end
204
+
205
+ /* Wrap / break */
206
+ .text-wrap, .text-nowrap, .text-break
207
+
208
+ /* Transform */
209
+ .text-lowercase, .text-uppercase, .text-capitalize
210
+
211
+ /* Weight / italics */
212
+ .fw-lighter, .fw-light, .fw-normal, .fw-medium, .fw-semibold, .fw-bold, .fw-bolder
213
+ .fst-normal, .fst-italic
214
+
215
+ /* Line height */
216
+ .lh-1, .lh-sm, .lh-base, .lh-lg
217
+
218
+ /* Family / reset / decoration */
219
+ .font-monospace, .text-reset
220
+ .text-decoration-none, .text-decoration-underline, .text-decoration-line-through
221
+
222
+ /* Size */
223
+ .fs-1, .fs-2, .fs-3, .fs-4, .fs-5, .fs-6
224
+
225
+ /* Truncate — needs display block/inline-block or a flex child with min-width 0 */
226
+ .text-truncate
227
+ ```
228
+
229
+ Two composition traps in this group:
230
+
231
+ - **`fs-*` without `lh-1` grows the row.** A resized glyph or mark keeps the parent's line-height, so the line box stretches and the row sits taller than its neighbors. Pair `fs-*` with `lh-1` on anything that is a mark rather than a paragraph.
232
+ - **`text-truncate` zeroes a flex item's automatic minimum size** (that's the `min-width: 0` it carries). Inside a flex _column_, that also removes the floor that kept a heading at its own height: a growing sibling then squeezes the title from the bottom until it clips. Floor the title with `flex-shrink-0` and let the growing sibling absorb the change.
233
+
234
+ ### Vertical Align
235
+
236
+ ```css
237
+ .align-baseline, .align-top, .align-middle, .align-bottom, .align-text-top, .align-text-bottom
238
+ ```
239
+
240
+ ### Visibility
241
+
242
+ ```css
243
+ .visible, .invisible
244
+ ```
245
+
246
+ ### Z-index
247
+
248
+ ```css
249
+ .z-n1, .z-0, .z-1, .z-2, .z-3 /* NOT responsive — no breakpoint variants exist */
250
+ ```
251
+
252
+ ## Spacing Scale
253
+
254
+ | Class | Size |
255
+ | ------ | ------------------------------ |
256
+ | `0` | 0 |
257
+ | `1` | $spacer \* .25 (0.25rem = 4px) |
258
+ | `2` | $spacer \* .5 (0.5rem = 8px) |
259
+ | `3` | $spacer (1rem = 16px) |
260
+ | `4` | $spacer \* 1.5 (1.5rem = 24px) |
261
+ | `5` | $spacer \* 3 (3rem = 48px) |
262
+ | `auto` | auto |
263
+
264
+ ## Z-index Scale (components)
265
+
266
+ | Component | Z-index |
267
+ | ------------------ | ------- |
268
+ | Dropdown | 1000 |
269
+ | Sticky | 1020 |
270
+ | Fixed | 1030 |
271
+ | Offcanvas backdrop | 1040 |
272
+ | Offcanvas | 1045 |
273
+ | Modal backdrop | 1050 |
274
+ | Modal | 1055 |
275
+ | Popover | 1070 |
276
+ | Tooltip | 1080 |
277
+ | Toast | 1090 |
278
+
279
+ ## Print Utilities
280
+
281
+ ```css
282
+ .d-print-none, .d-print-inline, .d-print-inline-block, .d-print-block, .d-print-grid, .d-print-table, .d-print-table-cell, .d-print-table-row, .d-print-flex, .d-print-inline-flex
283
+ ```
284
+
285
+ ## Helpers
286
+
287
+ Helpers are single-purpose classes that sit alongside utilities.
288
+
289
+ - **`.visually-hidden`** — hide visually, keep for screen readers (icon-button labels, table caption text, "Danger:" prefixes).
290
+ - **`.visually-hidden-focusable`** — hidden until focused; the skip-link class. Never combine with `.visually-hidden`.
291
+ - **`.stretched-link`** — makes a whole `position-relative` container (e.g. a card) the click target of one inner link, without wrapping everything in `<a>`.
292
+ - **`.ratio .ratio-16x9`** (also `1x1`, `4x3`, `21x9`, or `--bs-aspect-ratio`) — responsive embeds/iframes.
293
+ - **`.vstack` / `.hstack gap-*`** — shorthand vertical/horizontal flex stacks for quick toolbars and side rails.
294
+ - **`.vr`** — vertical rule divider inside an `.hstack` or flex row.
295
+ - **`.focus-ring`** (+ `.focus-ring-primary` … per theme color) — opt-in focus ring for custom interactive elements; tune via `--bs-focus-ring-width` (.25rem), `--bs-focus-ring-opacity` (.25), `--bs-focus-ring-color`, `--bs-focus-ring-x/y/blur`. Use it instead of `outline: none` hacks so keyboard focus stays visible.
296
+ - **`.icon-link`** (+ `.icon-link-hover`) — pairs a Bootstrap Icon SVG with a text link; icon auto-sizes to 1em; give decorative icons `aria-hidden="true"`. Hover shift via `--bs-icon-link-transform`.
297
+
298
+ ## Enterprise notes (utilities)
299
+
300
+ ### Composition habits
301
+
302
+ - **Spacing scale:** prefer `gap-*` on flex/grid parents over scattering `m-*` on every child — the parent owns rhythm, children stay reorderable. Use `p-3` / `p-4` for panel padding; reserve `p-5` for sparse marketing-like empty states.
303
+ - **Body surfaces:** `bg-body`, `bg-body-secondary`, `bg-body-tertiary` track `data-bs-theme` — raw `bg-white` / `bg-light` freeze the surface in light mode.
304
+ - **Text hierarchy:** `text-body` for content, `text-body-secondary` for meta, `text-*-emphasis` when a status must stay readable on subtle backgrounds. `text-body-tertiary` is the decoration tier — it misses the 4.5:1 bar for information-bearing small text, so anything a user must read is `text-body-secondary` or better.
305
+ - **Opacity traps:** `text-white-50` / `text-black-50` often fail contrast — prefer `text-opacity-75` on a known solid, or `text-body-secondary`. Every one of these pairings is measured against the shipped cascade in both themes; a skin retunes the same token names.
306
+ - **Flex floors:** a flex column gives its items an automatic minimum size, and `text-truncate` removes it. Titles and marks that must keep their height carry `flex-shrink-0`; only the growing sibling absorbs the slack.
307
+ - **Flex toolbars:** `d-flex align-items-center gap-2 flex-wrap` (or `flex-nowrap overflow-auto` for dense bars). Equal-height siblings: `align-items-stretch` + `h-100` on cards.
308
+ - **Responsive hide:** show the best layout per breakpoint (`d-none d-md-block` vs `d-md-none`) rather than cramming one layout everywhere. Below `sm`, hide button captions (`d-none d-sm-inline` on the label span, `aria-label` on the control so the accessible name stays) before you let the brand or page title truncate.
309
+ - **RTL safety:** always `ms-*`/`me-*`/`ps-*`/`pe-*`, `text-start`/`text-end`, `float-start`/`float-end` — the logical model is what lets one build serve LTR and RTL.
310
+ - **Density as a system:** when a screen offers compact/comfortable density, drive it from a token or wrapper class that swaps padding — not ad-hoc `-sm` sprinkling per element ([bootstrap-reference.md](bootstrap-reference.md) → Design tokens).
311
+ - **Shadows:** `shadow-sm` for panels in product UI; `shadow-lg` rarely belongs in dense admin screens.
312
+ - **Print:** mark chrome `d-print-none`; keep the data table/results printable.
@@ -2,20 +2,9 @@
2
2
 
3
3
  ## Map ownership
4
4
 
5
- Use this dependency model unless a package-specific guide narrows it:
5
+ Dependency direction across environments is the root project model in `AGENTS.md`, detailed for placement in `.claude/rules/workspace.md` and for app composition in `.claude/rules/application.md`. Read those; this reference does not restate them. Apply the same law to a dependency's `@orkestrel/<package>/browser` and `/server` exports, whose bare export is its core API.
6
6
 
7
- | Surface | May depend on | Must not depend on |
8
- | ------------- | ------------------------------------------------------------------- | -------------------------------------- |
9
- | `src/core` | host-independent Orkestrel core packages | Node, DOM, browser/server environments |
10
- | `src/server` | its core and server-capable dependencies | browser/app environments |
11
- | `src/browser` | its core and browser-capable dependencies | Node/server/app environments |
12
- | `app/core` | host-independent library/core and app/core logic | Node, DOM, app/server, app/browser |
13
- | `app/server` | app/core plus core/server libraries | browser/app/browser |
14
- | `app/browser` | app/core plus core/browser libraries and shared transport contracts | Node/app/server implementation |
15
-
16
- Browser application code reaches server behavior through shared contracts and transports, not server implementation imports.
17
-
18
- Framework packages own reusable mechanisms. Applications own workflows, policy, presentation, users, authorization decisions, and product-specific defaults.
7
+ Ownership across packages is what those rules leave open: framework packages own reusable mechanisms, and applications own workflows, policy, presentation, users, authorization decisions, and product-specific defaults.
19
8
 
20
9
  ## Use consumers as evidence
21
10
 
@@ -53,4 +42,6 @@ Place each proof at the highest useful layer:
53
42
 
54
43
  Use the actual packages and transports. Use temporary resources or protocol-faithful fixture servers for deterministic network boundaries. Use the real external service when its behavior is the claim. Never simulate an owned package with a mock or fake.
55
44
 
45
+ When the claim is that a foreign client can consume the stack — an editor, an agent CLI, a third-party protocol client — one representative real client of that class drives the surface end to end before the claim ships. Record the exact commands, the authentication and approval model that client needed, and every part of the surface it could not reach. Protocol-level tests prove the protocol; only the client proves the integration.
46
+
56
47
  Test both successful composition and contract disagreement: invalid options, unavailable capability, partial failure, abort/cleanup, version mismatch, and lifecycle ordering where applicable.
@@ -5,60 +5,88 @@ description: Design, scaffold, extend, or harden Orkestrel `app/core`, `app/brow
5
5
 
6
6
  # Build an Orkestrel application
7
7
 
8
- Read `AGENTS.md`, `.claude/rules/application.md`, `.claude/rules/workspace.md`,
9
- `.claude/rules/architecture.md`, `.claude/rules/documentation.md`, and every other rule
10
- selected by the files in scope. Then read
11
- [`references/application.md`](references/application.md) completely.
8
+ ## Load authority
12
9
 
13
- ## Workflow
10
+ Read the current files in this order:
14
11
 
15
- 1. Inventory existing `src`, `app`, `configs`, tests, manifest scripts, aliases,
16
- and guide rows. Treat current code as evidence, not policy.
17
- 2. Select only required environments. `--src` selects published src environments and
18
- `--app` selects private app environments; the two selections are independent,
19
- at least one is required, and there is no `--surfaces` synonym. Each side offers
20
- `core`, `browser`, and `server`. Browser and server may depend on their core, core
21
- depends on neither host implementation, and browser/server remain disjoint.
22
- 3. Define or refine public contracts in each environment's `types.ts` before
23
- implementation. Inspect exact installed `@orkestrel/*` capabilities before
24
- writing boundary code, and reuse a primitive whose semantics match.
25
- 4. Add aliases in root TypeScript configuration and derive Vite aliases from
26
- them. Keep `configs/app` wrappers thin.
27
- 5. Implement complete entries, `export *`-only barrels, centralized `types.ts` /
28
- `constants.ts` / `helpers.ts` and their sibling kind files, dedicated one-class
29
- implementation files, environment parsing, lifecycle, builds, and scripts.
30
- App-only manifests must be `private: true`; mixed manifests publish only
31
- `dist/src` and never expose `dist/app`.
32
- 6. Keep boundary enforcement inside the configured toolchain, each layer owning what
12
+ 1. `AGENTS.md`.
13
+ 2. `.claude/rules/application.md` for composition, entries, manifest safety, and
14
+ lifecycle; `.claude/rules/workspace.md` for environments, aliases, configuration, and
15
+ scripts; `.claude/rules/architecture.md` for placement and barrels;
16
+ `.claude/rules/tests.md` for test law; `.claude/rules/documentation.md` for parity;
17
+ plus every other rule the files in scope select.
18
+ 3. `guides/README.md`, the governing application guide, and `ROADMAP.md` when present.
19
+ 4. The authoritative `*/types.ts` of each selected environment, the root
20
+ `tsconfig.json` and `vite.config.ts`, the manifest, and `configs/app`.
21
+
22
+ Those rules are the contract; this skill is only the workflow. Where a step names a law,
23
+ read the law rather than this summary of it.
24
+
25
+ ## Select the environments
26
+
27
+ `--src` selects published src environments and `--app` selects private app environments.
28
+ The selections are independent, at least one is required, each offers `core`, `browser`,
29
+ and `server`, and there is no `--surfaces` synonym.
30
+
31
+ | Selection | What it owns |
32
+ | ----------- | ------------------------------------------------------------------------ |
33
+ | app/core | Host-independent contracts and composition; check and test only |
34
+ | app/browser | Vue runtime behind an `index.html` entry, `vue-tsc`, real Chromium tests |
35
+ | app/server | Node runtime, `dist/app/server/main.cjs` with only `node:*` external |
36
+
37
+ Core-only, browser-only, and server-only applications are valid. A browser+server pair
38
+ includes app/core so the shared transport contracts have one host-independent owner.
39
+
40
+ ## Execute the workflow
41
+
42
+ 1. **Inventory** existing `src`, `app`, `configs`, tests, manifest scripts, aliases, and
43
+ guide rows. Treat current code as evidence, not policy.
44
+ 2. **Contract first.** Define or refine each environment's `types.ts` before
45
+ implementation, and inspect the exact installed `@orkestrel/*` capabilities before
46
+ writing any boundary code.
47
+ 3. **Wire configuration.** Root `tsconfig.json` owns the `@app/*` aliases and root
48
+ `vite.config.ts` derives from them and owns the Vitest projects; `configs/app` holds
49
+ thin target wrappers and scoped tsconfigs.
50
+ 4. **Implement completely** — entries, barrels, centralized declarations, one-class
51
+ implementation files, environment parsing, lifecycle, builds, and scripts — under the
52
+ placement and manifest laws. Parse the options container and its host and port leaves
53
+ before mutation, rejecting wrong-shaped containers, empty hosts, and non-integer,
54
+ negative, or out-of-range ports with a coded error and its guard.
55
+ 5. **Own the shutdown contract.** Lifecycle transitions serialize in call order, an
56
+ ephemeral restart re-requests port zero, stop closes hostile active connections
57
+ deterministically, and runner stop idempotently releases its signal listeners. Runner
58
+ generations isolate asynchronous failures so an older transition cannot release a
59
+ newer run's listeners, and convenience startup returns the runner rather than hiding
60
+ that cleanup.
61
+ 6. **Keep boundary enforcement inside the configured toolchain,** each layer owning what
33
62
  it can express: Oxlint `no-restricted-imports` for literal-string declared package,
34
63
  alias, and conventional relative import direction; Oxfmt for formatting;
35
64
  `tests/setupPolicy.ts` as the narrow TypeScript compiler-API pass over computed and
36
65
  template-literal specifiers, declaration placement, and the barrel law; scoped
37
- TypeScript projects for host-global isolation; and Vite's real browser/server
38
- builds and environment-boundary plugin for Vue, CSS, assets, workers, runtime
39
- resolution, and physical workspace containment, using Vite's Oxc AST for
40
- TypeScript/JavaScript, the official Vue SFC compiler for `.vue` blocks, Vite's
41
- HTML parser callbacks, and Vite's bundled Lightning CSS dependency analyzer.
42
- Exercise the combined configuration through
43
- fresh generated-consumer lint, typecheck, build, and integration tests. Add no
44
- standalone boundary script and no second general-purpose parser or source-language
45
- analyzer duplicating those layers. Keep browser-only runtime tooling
46
- development-only and require explicit authorization before adding a Sass compiler.
47
- 7. Add real app/core Node tests, app/browser Playwright-backed Chromium tests,
48
- app/server loopback and child-process tests, and cross-environment integration.
49
- Exercise repeated lifecycle, malformed environment values, protocol failures,
50
- concurrency, hostile connections, and cleanup. A signal-owning server runner must
51
- expose idempotent explicit stop so normal shutdown releases every installed process
52
- listener; stale asynchronous failures cannot mutate a newer generation, and
53
- convenience starters return the runner rather than hiding that cleanup contract.
54
- Keep the runner class alone in `ApplicationServerRunner.ts` and its convenience
55
- starter in centralized `factories.ts`.
56
- 8. Update the guide, examples, manifest index, and parity specifiers for every
57
- app export and behavioral method.
58
- 9. Run source cleanup, test cleanup, one independent design audit and one
59
- independent objective audit, a mechanical conformance pass, and the
60
- repository gates in their required order.
66
+ TypeScript projects for host-global isolation; and Vite's real builds and
67
+ environment-boundary plugin for Vue, CSS, assets, workers, runtime resolution, and
68
+ physical workspace containment. Add no standalone boundary script and no second
69
+ parser or source-language analyzer duplicating those layers. Disable the browser
70
+ application's public directory so an unmanaged file copy cannot bypass the module
71
+ graph. Keep browser-only runtime tooling development-only and require explicit
72
+ authorization before adding a Sass compiler.
73
+ 7. **Prove it on real hosts.** app/browser tests run on Playwright-backed Vitest Browser
74
+ Mode against real DOM, probing the installed executable directly with
75
+ `existsSync(chromium.executablePath())` rather than guessing a channel or reading an
76
+ environment flag; app/server tests bind port zero on loopback and use real fetch;
77
+ real child-process tests prove executable readiness, collision exit, signal
78
+ termination, and port release, remembering that Windows reports
79
+ `ChildProcess.kill('SIGTERM')` as OS termination by signal while POSIX delivery
80
+ exercises the graceful listener and exits zero. A capability-dependent test probes the
81
+ actual capability and scopes any skip narrowly.
82
+ 8. **Document and prove parity** for every app export and behavioral method: guide,
83
+ examples, manifest index, and the parity specifiers walking the existing `src` and
84
+ `app` roots and every selected alias.
85
+ 9. **Verify.** Run the rules' cleanup sweeps over source and tests, then one independent
86
+ design audit, one independent objective audit, a mechanical conformance pass, and the
87
+ repository gates in their required order. Generated CI runs those gates on the declared
88
+ minimum Node release and on the current major.
61
89
 
62
- Do not add showcase, authentication, persistence, proxy, styling-system, or
63
- product policy unless the request requires it. Do not leave placeholders,
64
- compatibility shims, empty setup files, or deferred app behavior.
90
+ Do not add showcase, authentication, persistence, proxy, styling-system, or product
91
+ policy unless the request requires it. Do not leave placeholders, compatibility shims,
92
+ empty setup files, or deferred app behavior.
@@ -0,0 +1,81 @@
1
+ ---
2
+ name: orkestrel-debrief
3
+ description: Convert a closed campaign's residue into portable truth through field evidence, a findings ledger, fix loops with live re-proof, canon refinement, and disciplined disposal. Use after a campaign or milestone closes to audit what was built and how it was built, when live field testing must precede judgment, when learnings must propagate into skills/rules/guides/scaffold, or when working ledgers must fold into canon and retire.
4
+ ---
5
+
6
+ # Debrief a closed campaign
7
+
8
+ ## Load authority
9
+
10
+ Read the current files in this order:
11
+
12
+ 1. `AGENTS.md`.
13
+ 2. Every applicable `.claude/rules/*.md`; the documentation and quality laws bind every
14
+ ledger entry and every canon refinement this skill produces.
15
+ 3. [field-testing.md](references/field-testing.md) before running or judging any live
16
+ field pass.
17
+ 4. `guides/README.md`, the governing guide for what the campaign built, and `ROADMAP.md`.
18
+
19
+ The user's current instruction wins. The debrief judges both the artifact and the process
20
+ that produced it; neither is exempt.
21
+
22
+ ## The debrief laws
23
+
24
+ - **Use it before you judge it.** A debrief of a surface nobody drove is a review of
25
+ intentions. Field evidence — real clients, real harnesses, goal-only prompts — precedes
26
+ every finding about usability, and the field transcript is the evidence of record.
27
+ - **Evidence is verbatim or it is not evidence.** The ledger quotes exact commands, exact
28
+ refusals, exact reasoning-trace lines. A paraphrase cannot be re-verified after the
29
+ session that produced it is gone.
30
+ - **Every finding ends in exactly one bucket**: fix now; canon refinement (skill, rule,
31
+ guide); promotion (package/library boundary move); stays as-is with the reason; or
32
+ dropped on the record with the refuting evidence. A finding with no bucket is an
33
+ unfinished debrief.
34
+ - **Fixes are re-proven by the class of evidence that found them.** A defect found by a
35
+ live field pass is closed by a live field pass, never by the fix's own tests alone.
36
+ - **Portable versus resident.** Anything reusable beyond this repository — process
37
+ doctrine, teaching-surface laws, harness knowledge — lands in the portable skill/rule
38
+ set and propagates through the scaffold. Repository-specific truth lands in the guide.
39
+ Forward-looking work lands in `ROADMAP.md`. Nothing load-bearing stays only in the
40
+ ledger.
41
+ - **The ledger is ephemeral.** The debrief folder is a working file: fold every surviving
42
+ truth into its destination, then delete the folder on the owner's explicit go-ahead —
43
+ never silently, and never leave it as residue after its campaign.
44
+
45
+ ## Run the round
46
+
47
+ 1. **Scope.** Name the campaign(s) under debrief, the artifact surfaces involved, and the
48
+ audiences that matter (human operators, frontier models, small models, external
49
+ clients). State what evidence already exists and what must be produced live.
50
+ 2. **Field passes.** Drive the artifact with representative real consumers per
51
+ [field-testing.md](references/field-testing.md): goal-only prompts, no coaching, the
52
+ tier ladder from frontier to the smallest model that matters, reasoning traces
53
+ captured wherever the runtime exposes them. Record every pass verbatim in the ledger.
54
+ 3. **Layer audits.** In parallel with the field passes, audit each layer the campaign
55
+ touched: implementation boundaries (what belongs a layer down or in a published
56
+ package), the process record (which dispatches failed, which laws were missing, where
57
+ executors deviated), and the instruction set itself (agents, rules, skills — what
58
+ confused an executor is a defect in the instruction, not the executor).
59
+ 4. **Reconcile into the ledger.** Number the findings, attach verbatim evidence to each,
60
+ and bucket every one. Confusion signatures from reasoning traces are findings about
61
+ the artifact's teaching surface, not anecdotes — see the signature catalog in
62
+ [field-testing.md](references/field-testing.md).
63
+ 5. **Fix loops.** Dispatch fix-now findings as bounded units under the repository's
64
+ engine contract, serialized, failing-first. After each round, re-run the field passes
65
+ that found the class and record the delta. Iterate until the field tier that matters
66
+ walks the surface unaided or the residual is proven to be consumer-floor, not
67
+ artifact darkness — state which, with evidence.
68
+ 6. **Canon refinement.** Write or revise the portable skills/rules the findings justify;
69
+ update the guide for resident truth; update `ROADMAP.md` for forward work. Every
70
+ retained finding names the artifact that now carries it.
71
+ 7. **Propagate.** Land the portable set in the scaffold repository so every future
72
+ project inherits it; run the scaffold's own gates before pushing.
73
+ 8. **Dispose.** Present the ledger's disposition map to the owner: what folded where,
74
+ what remains open. Delete the ledger only on their explicit go-ahead.
75
+
76
+ ## Verdict shape
77
+
78
+ Each debrief round ends with one fixed report: the finding table (id, evidence pointer,
79
+ bucket, carrier), the field-pass scoreboard before and after, the canon delta (files
80
+ created or changed), and exactly one terminal line — `DEBRIEF: FOLDED` when every finding
81
+ has a carrier and the propagation is pushed, or `DEBRIEF: OPEN` with the blocking items.