haac-aikit 0.9.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -0
- package/catalog/skills/tier1/html-artifacts.md +57 -7
- package/catalog/templates/html-artifacts/01-exploration-code-approaches.html +2 -2
- package/catalog/templates/html-artifacts/02-exploration-visual-designs.html +2 -2
- package/catalog/templates/html-artifacts/03-code-review-pr.html +2 -2
- package/catalog/templates/html-artifacts/05-design-system.html +2 -2
- package/catalog/templates/html-artifacts/06-component-variants.html +2 -2
- package/catalog/templates/html-artifacts/07-prototype-animation.html +3 -3
- package/catalog/templates/html-artifacts/08-prototype-interaction.html +2 -2
- package/catalog/templates/html-artifacts/09-slide-deck.html +4 -0
- package/catalog/templates/html-artifacts/10-svg-illustrations.html +8 -5
- package/catalog/templates/html-artifacts/11-status-report.html +2 -2
- package/catalog/templates/html-artifacts/12-incident-report.html +2 -2
- package/catalog/templates/html-artifacts/13-flowchart-diagram.html +4 -3
- package/catalog/templates/html-artifacts/15-research-concept-explainer.html +1 -1
- package/catalog/templates/html-artifacts/16-implementation-plan.html +4 -3
- package/catalog/templates/html-artifacts/18-editor-triage-board.html +2 -2
- package/catalog/templates/html-artifacts/19-editor-feature-flags.html +2 -2
- package/catalog/templates/html-artifacts/20-editor-prompt-tuner.html +2 -2
- package/dist/cli.mjs +110 -71
- package/dist/cli.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -6,6 +6,13 @@
|
|
|
6
6
|
|
|
7
7
|
One command drops a working AI-coding setup into any repo — rules, skills, safety hooks, subagents, MCP stub, CI templates — for Claude Code, Cursor, Copilot, Windsurf, Aider, Gemini CLI, and Codex.
|
|
8
8
|
|
|
9
|
+
> [!TIP]
|
|
10
|
+
> **Just want HTML output from Claude Code?** Skip the full kit and install only the html-artifacts skill + 20 templates:
|
|
11
|
+
>
|
|
12
|
+
> ```bash
|
|
13
|
+
> npx haac-aikit init html
|
|
14
|
+
> ```
|
|
15
|
+
|
|
9
16
|
## Quickstart
|
|
10
17
|
|
|
11
18
|
```bash
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: html-artifacts
|
|
3
3
|
description: Use when producing structured output that benefits from rich layout, comparison, drill-in, or interaction — specs, plans, PR reviews, design systems, prototypes, diagrams, decks, research explainers, reports, and custom editors. Scaffolds from 20 forked reference templates at `.aikit/templates/html-artifacts/` and fills them with project context. Maintains a gallery at `.aikit/artifacts/index.html`.
|
|
4
|
-
version: "2.
|
|
4
|
+
version: "2.3.0"
|
|
5
5
|
source: haac-aikit
|
|
6
6
|
license: MIT
|
|
7
7
|
inspired-by: https://thariqs.github.io/html-effectiveness (templates forked with permission, 2026-05-12)
|
|
@@ -35,6 +35,42 @@ When conditions match but the user didn't ask for HTML, say one sentence and wai
|
|
|
35
35
|
- **Provenance footer**: every generated artifact ends with `Sources: … — generated <ISO timestamp>`
|
|
36
36
|
- **AUTO-GENERATED pill**: top-right badge on agent-produced artifacts so readers know the origin
|
|
37
37
|
- **Prompt callout**: exploration / planning artifacts preserve the originating user request in a cream-tinted box at top
|
|
38
|
+
- **Density-adaptive rendering**: when the artifact's total visible items (milestones + risks + cards + rows across all sections) is ≤ 6, drop decorations designed for dense pages — section numbers, tag chips, colored dot indicators, multi-column summary cards. These visuals were tuned for ~12-item artifacts; on sparse content they read as noise instead of hierarchy. The point of structure is signal; if there's little content, decoration buries it.
|
|
39
|
+
- **Decision callout first**: any artifact that asks the user to decide something starts with a "Decision needed" block at the top — the call-to-action in one sentence, options in chips (`A —` / `B —`), the recommendation marked. Don't make decision-makers scroll to find what to approve.
|
|
40
|
+
|
|
41
|
+
## Accessibility (a11y)
|
|
42
|
+
|
|
43
|
+
Decision documents get read on phones, with screen readers, in high-contrast mode, by keyboard-only users. The bar is the same as the voice rule — make the artifact work for the actual reading environment, not just a desktop browser.
|
|
44
|
+
|
|
45
|
+
**Hard rules:**
|
|
46
|
+
|
|
47
|
+
1. **Landmark roles** — wrap top-level structure in `<main>`, `<nav>`, `<article>`, `<aside>`. Screen readers use these to navigate; readers without them have to crawl the document linearly.
|
|
48
|
+
2. **Alt text on every diagram and icon** — inline `<svg>` gets `<title>` + `aria-labelledby` or `aria-label`; `<img>` gets `alt="..."`. Purely decorative icons get `aria-hidden="true"` so they don't announce as noise.
|
|
49
|
+
3. **Heading hierarchy never skips levels** — `<h1>` → `<h2>` → `<h3>`. Exactly one `<h1>` per artifact (the title).
|
|
50
|
+
4. **Native form controls only** — `<input>` paired with `<label for="...">`, `<button>` for buttons, native `<select>`. No div-button hacks.
|
|
51
|
+
5. **Color contrast ≥ 4.5:1 for body text, ≥ 3:1 for large text** — design tokens already meet WCAG AA; don't override per-artifact in ways that break the ratio.
|
|
52
|
+
6. **Keyboard focus visible** — never `outline: none` without a `:focus-visible` replacement that meets contrast.
|
|
53
|
+
|
|
54
|
+
## Voice & plain-language rule
|
|
55
|
+
|
|
56
|
+
The default reader is a smart non-specialist taking a decision. They should understand every sentence on first read without expanding tooltips, looking up jargon, or having prior domain context.
|
|
57
|
+
|
|
58
|
+
**Four sub-rules:**
|
|
59
|
+
|
|
60
|
+
1. **One concept per sentence** — no "X with Y and Z" compounds.
|
|
61
|
+
2. **Plain-language verb + concrete object** — "Load images only when the reader scrolls to them" beats "Implement lazy-loading via IntersectionObserver."
|
|
62
|
+
3. **Jargon lives in tag chips, `<code>` spans, or collapsed `<details>`** — never in the main reading path.
|
|
63
|
+
4. **Concrete first, abstract term in parens** — "Make sure failed requests retry safely (idempotent)" beats "Idempotent retry on failure."
|
|
64
|
+
|
|
65
|
+
**Three side-by-side examples (bad → good):**
|
|
66
|
+
|
|
67
|
+
| Bad | Good |
|
|
68
|
+
| --- | --- |
|
|
69
|
+
| "Schema & API contract — tRPC router stubs reviewed before anything else lands" | "Define the API the backend will expose. Review the contract before any UI work." |
|
|
70
|
+
| "Optimistic insert with rollback on failure, one level of nesting only" | "Show the comment immediately. Roll back if the server rejects it. One level of replies — no deeper threads." |
|
|
71
|
+
| "Fan-out via realtime channel, per-user read cursors track unread state" | "When a card is open, listen for new comments on it. Push updates to everyone watching." |
|
|
72
|
+
|
|
73
|
+
The technical details (`tRPC`, `optimistic insert`, `fan-out`) still appear in the artifact — but as tag chips beneath the prose, not in the reading path. The visible layer is decision-grade scannable; the chip layer keeps the artifact grep-able and AI-readable.
|
|
38
74
|
|
|
39
75
|
## Pattern playbook (9 patterns, aligned with the source)
|
|
40
76
|
|
|
@@ -42,7 +78,7 @@ When conditions match but the user didn't ask for HTML, say one sentence and wai
|
|
|
42
78
|
**Templates**: `01-exploration-code-approaches.html`, `02-exploration-visual-designs.html`, `16-implementation-plan.html`
|
|
43
79
|
**Use for**: comparing N approaches, exploring visual directions, handing off a plan
|
|
44
80
|
**Concrete techniques**: numbered approach badges (`01`/`02`/`03`) in oat chips · equal-width code blocks for visual symmetry · pro/con tables with colored dot bullets (olive=pro, clay=con) · chip metrics footer (bundle, testability, reuse, SSR safety) · recommendation callout with left clay border + serif 22px · light/dark toggle via single `:root` swap · numbered milestone rows with date columns on left · phase cards with package chips · risks table (RISK / SEV / MITIGATION) · "Decide with · person · before slice N" footer on open questions
|
|
45
|
-
**Must-haves**: preserve the originating prompt as a top callout; numbered section dots if > 4 sections
|
|
81
|
+
**Must-haves**: preserve the originating prompt as a top callout; numbered section dots if > 4 sections; **Decision needed block at the very top** — a clay-bordered card stating the call-to-action, the options considered (chips: `A —` / `B —`), and which one is recommended. Buried decisions are the failure mode this prevents.
|
|
46
82
|
|
|
47
83
|
### 2. Code Review & Understanding
|
|
48
84
|
**Templates**: `03-code-review-pr.html`, `17-pr-writeup.html`, `04-code-understanding.html`
|
|
@@ -105,6 +141,9 @@ When conditions match but the user didn't ask for HTML, say one sentence and wai
|
|
|
105
141
|
- Missing keyboard nav for editors — native form controls, not div-clicks
|
|
106
142
|
- Missing AUTO-GENERATED badge on agent-produced artifacts — readers deserve to know
|
|
107
143
|
- Missing provenance footer — "where did these numbers come from?" should always be answerable
|
|
144
|
+
- **Jargon-heavy main prose** — using `tRPC`, `fan-out`, `idempotent`, `IntersectionObserver` in the reading path makes the artifact unreadable for non-specialists. Plain-language verb + concrete object in prose; technical terms in tag chips and code blocks.
|
|
145
|
+
- **Decision buried below the fold** — artifact asks the user to approve, choose, or sign off but the call-to-action lives in Milestones or Risks, not at the top. Decision-makers shouldn't have to scroll to find what they're approving.
|
|
146
|
+
- **Missing alt text / aria-label on SVG and `<img>`** — diagrams and charts become invisible to screen readers, low-vision users, and search / indexing. Every visual element gets a text equivalent.
|
|
108
147
|
|
|
109
148
|
## Template scaffolding
|
|
110
149
|
|
|
@@ -117,15 +156,26 @@ When conditions match but the user didn't ask for HTML, say one sentence and wai
|
|
|
117
156
|
1. **Read the manifest first**: `Read .aikit/templates/html-artifacts/MANIFEST.json`. Find the entry whose `category` matches the pattern from the playbook above and whose `slug` best matches the user's intent.
|
|
118
157
|
2. **Read the matching template**: `Read .aikit/templates/html-artifacts/<file>.html` (the `file` field from the manifest entry). This is non-optional. If the file is missing, ask the user to run `aikit sync`; do not proceed without it.
|
|
119
158
|
3. **Gather real project context**: run the appropriate commands — `git diff main...HEAD`, `git log --since=...`, read files mentioned in the prompt, etc. Replace the template's placeholder content with these real facts.
|
|
120
|
-
4. **
|
|
159
|
+
4. **Prune irrelevant sections before filling**. Scan the template's `<section>` blocks; for any not required by the user's intent, OMIT them from the filled artifact entirely (don't render them with empty placeholders). Aim for the minimum sections that carry signal — keeping all sections "just in case" forces the reader to skim each one to decide whether it's relevant. Section-keep guide:
|
|
160
|
+
|
|
161
|
+
| Templates | Always include | Optional (only if relevant) |
|
|
162
|
+
| --- | --- | --- |
|
|
163
|
+
| `01`, `02`, `16` (Exploration & Planning) | Milestones / Approaches + Risks | Data flow §02 (only if client↔server movement) · Mockups §03 (only if UI work) · Key code §04 (only if specific patterns to highlight) |
|
|
164
|
+
| `03`, `17`, `04` (Code Review) | PR header · Per-file details · Comments | Risk map (only if multiple severities) · Module-map SVG (only for arch reviews) |
|
|
165
|
+
| `11`, `12` (Reports) | Metric band + main table | Velocity chart (only if time series) · Incident timeline (only for incidents) |
|
|
166
|
+
| `18`, `19`, `20` (Editors) | Real columns + export button | Dependency warnings (only if dependencies) |
|
|
167
|
+
| All others | Core content sections of the pattern | Any section where placeholders would carry no signal |
|
|
168
|
+
|
|
169
|
+
5. **Preserve structure verbatim** when writing the filled artifact:
|
|
121
170
|
- All `:root` CSS variables (`--clay`, `--slate`, `--ivory`, `--oat`, `--olive`, `--gray-*`)
|
|
122
171
|
- All class names, layout grids, and microinteraction conventions
|
|
123
172
|
- All cross-cutting techniques (sticky positioning, `scroll-margin-top`, `<details>` collapsibles, native form controls)
|
|
124
173
|
- The pattern's visual language (severity colors, badge styles, dot indicators, monospace meta text)
|
|
125
|
-
|
|
126
|
-
6. **Add
|
|
127
|
-
7. **
|
|
128
|
-
8. **
|
|
174
|
+
- **Apply the Voice & plain-language rule** when writing prose into content nodes (`<p>`, `<h3>`, milestone bodies, risk explanations). Jargon goes in tag chips, `<code>` spans, or `<details>` — never in main prose.
|
|
175
|
+
6. **Add required `<head>` elements**: `<title>`, `<meta name="description">`, and `<meta name="aikit-pattern" content="...">` with one of: `Exploration`, `Code Review`, `Design`, `Prototype`, `Illustrations`, `Deck`, `Research`, `Report`, `Editor`.
|
|
176
|
+
7. **Add AUTO-GENERATED pill** top-right and **provenance footer** (`Sources: ... — generated <ISO timestamp>`).
|
|
177
|
+
8. **Save** to `.aikit/artifacts/NN-<slug>.html` (increment `NN` from existing files).
|
|
178
|
+
9. **Regenerate gallery index** per the protocol below.
|
|
129
179
|
|
|
130
180
|
### User-driven scaffolding (alternative)
|
|
131
181
|
|
|
@@ -254,7 +254,7 @@
|
|
|
254
254
|
</style>
|
|
255
255
|
</head>
|
|
256
256
|
<body>
|
|
257
|
-
<
|
|
257
|
+
<main class="page">
|
|
258
258
|
|
|
259
259
|
<header class="page-head">
|
|
260
260
|
<div class="eyebrow">Exploration · Birchline web client</div>
|
|
@@ -448,6 +448,6 @@
|
|
|
448
448
|
</p>
|
|
449
449
|
</aside>
|
|
450
450
|
|
|
451
|
-
</
|
|
451
|
+
</main>
|
|
452
452
|
</body>
|
|
453
453
|
</html>
|
|
@@ -392,7 +392,7 @@
|
|
|
392
392
|
</div>
|
|
393
393
|
</div>
|
|
394
394
|
|
|
395
|
-
<
|
|
395
|
+
<main class="page">
|
|
396
396
|
|
|
397
397
|
<header class="page-head">
|
|
398
398
|
<div class="eyebrow">Exploration · Empty states</div>
|
|
@@ -502,7 +502,7 @@
|
|
|
502
502
|
</article>
|
|
503
503
|
|
|
504
504
|
</section>
|
|
505
|
-
</
|
|
505
|
+
</main>
|
|
506
506
|
|
|
507
507
|
<script>
|
|
508
508
|
const stages = document.querySelectorAll('.stage');
|
|
@@ -395,7 +395,7 @@
|
|
|
395
395
|
</style>
|
|
396
396
|
</head>
|
|
397
397
|
<body>
|
|
398
|
-
<
|
|
398
|
+
<main class="page">
|
|
399
399
|
|
|
400
400
|
<header class="pr-head">
|
|
401
401
|
<div class="repo-line">birchline/web · Pull Request #247</div>
|
|
@@ -620,7 +620,7 @@
|
|
|
620
620
|
</ul>
|
|
621
621
|
</footer>
|
|
622
622
|
|
|
623
|
-
</
|
|
623
|
+
</main>
|
|
624
624
|
|
|
625
625
|
<script>
|
|
626
626
|
// Briefly highlight a file card when reached via the risk-map anchors.
|
|
@@ -353,7 +353,7 @@
|
|
|
353
353
|
</style>
|
|
354
354
|
</head>
|
|
355
355
|
<body>
|
|
356
|
-
<
|
|
356
|
+
<main class="page">
|
|
357
357
|
|
|
358
358
|
<header>
|
|
359
359
|
<h1>Birchline design system</h1>
|
|
@@ -624,6 +624,6 @@
|
|
|
624
624
|
</div>
|
|
625
625
|
</section>
|
|
626
626
|
|
|
627
|
-
</
|
|
627
|
+
</main>
|
|
628
628
|
</body>
|
|
629
629
|
</html>
|
|
@@ -360,7 +360,7 @@
|
|
|
360
360
|
</style>
|
|
361
361
|
</head>
|
|
362
362
|
<body>
|
|
363
|
-
<
|
|
363
|
+
<main class="page">
|
|
364
364
|
|
|
365
365
|
<header>
|
|
366
366
|
<h1>Card variant matrix</h1>
|
|
@@ -553,7 +553,7 @@
|
|
|
553
553
|
<pre id="snippet">// hover a card to preview its props</pre>
|
|
554
554
|
</div>
|
|
555
555
|
|
|
556
|
-
</
|
|
556
|
+
</main>
|
|
557
557
|
|
|
558
558
|
<script>
|
|
559
559
|
(function () {
|
|
@@ -346,7 +346,7 @@
|
|
|
346
346
|
</style>
|
|
347
347
|
</head>
|
|
348
348
|
<body>
|
|
349
|
-
<
|
|
349
|
+
<main class="wrap">
|
|
350
350
|
|
|
351
351
|
<header>
|
|
352
352
|
<div class="eyebrow">Birchline / prototype / micro-interaction</div>
|
|
@@ -363,7 +363,7 @@
|
|
|
363
363
|
<div class="stage">
|
|
364
364
|
<div class="task" id="task">
|
|
365
365
|
<div class="check">
|
|
366
|
-
<svg viewBox="0 0 16 16"><path d="M3 8.5 L6.5 12 L13 4.5"/></svg>
|
|
366
|
+
<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M3 8.5 L6.5 12 L13 4.5"/></svg>
|
|
367
367
|
</div>
|
|
368
368
|
<span class="label">Send weekly digest</span>
|
|
369
369
|
<span class="due">Fri</span>
|
|
@@ -433,7 +433,7 @@
|
|
|
433
433
|
transition-delay: 600ms; }</pre>
|
|
434
434
|
</section>
|
|
435
435
|
|
|
436
|
-
</
|
|
436
|
+
</main>
|
|
437
437
|
|
|
438
438
|
<script>
|
|
439
439
|
var task = document.getElementById('task');
|
|
@@ -243,7 +243,7 @@
|
|
|
243
243
|
</style>
|
|
244
244
|
</head>
|
|
245
245
|
<body>
|
|
246
|
-
<
|
|
246
|
+
<main class="wrap">
|
|
247
247
|
|
|
248
248
|
<header>
|
|
249
249
|
<div class="eyebrow">Birchline / prototype / interaction</div>
|
|
@@ -335,7 +335,7 @@
|
|
|
335
335
|
</div>
|
|
336
336
|
|
|
337
337
|
</div>
|
|
338
|
-
</
|
|
338
|
+
</main>
|
|
339
339
|
|
|
340
340
|
<script>
|
|
341
341
|
var list = document.getElementById('list');
|
|
@@ -368,6 +368,8 @@
|
|
|
368
368
|
</head>
|
|
369
369
|
<body>
|
|
370
370
|
|
|
371
|
+
<main>
|
|
372
|
+
|
|
371
373
|
<!-- ============================================================
|
|
372
374
|
Slide 1 — Title
|
|
373
375
|
============================================================ -->
|
|
@@ -555,6 +557,8 @@
|
|
|
555
557
|
</div>
|
|
556
558
|
</section>
|
|
557
559
|
|
|
560
|
+
</main>
|
|
561
|
+
|
|
558
562
|
<!-- ============================================================
|
|
559
563
|
Slide counter
|
|
560
564
|
============================================================ -->
|
|
@@ -186,7 +186,7 @@
|
|
|
186
186
|
</style>
|
|
187
187
|
</head>
|
|
188
188
|
<body>
|
|
189
|
-
<
|
|
189
|
+
<main class="sheet">
|
|
190
190
|
|
|
191
191
|
<header>
|
|
192
192
|
<h1>Background jobs — header illustrations</h1>
|
|
@@ -203,7 +203,8 @@
|
|
|
203
203
|
============================================================ -->
|
|
204
204
|
<figure>
|
|
205
205
|
<div class="canvas">
|
|
206
|
-
<svg id="ill-queue" xmlns="http://www.w3.org/2000/svg" width="720" height="320" viewBox="0 0 720 320">
|
|
206
|
+
<svg id="ill-queue" xmlns="http://www.w3.org/2000/svg" width="720" height="320" viewBox="0 0 720 320" role="img" aria-labelledby="svg-queue-title">
|
|
207
|
+
<title id="svg-queue-title">Background job queue illustration showing five pending jobs and a worker pulling the next job for processing</title>
|
|
207
208
|
<defs>
|
|
208
209
|
<style>
|
|
209
210
|
.m { font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace; font-size: 11px; }
|
|
@@ -265,7 +266,8 @@
|
|
|
265
266
|
============================================================ -->
|
|
266
267
|
<figure>
|
|
267
268
|
<div class="canvas">
|
|
268
|
-
<svg id="ill-retry" xmlns="http://www.w3.org/2000/svg" width="720" height="320" viewBox="0 0 720 320">
|
|
269
|
+
<svg id="ill-retry" xmlns="http://www.w3.org/2000/svg" width="720" height="320" viewBox="0 0 720 320" role="img" aria-labelledby="svg-retry-title">
|
|
270
|
+
<title id="svg-retry-title">Retry with backoff timeline showing four attempts on a job, with exponential delays of one, two, and four seconds before the fourth succeeds</title>
|
|
269
271
|
<defs>
|
|
270
272
|
<style>
|
|
271
273
|
.m { font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace; font-size: 11px; }
|
|
@@ -332,7 +334,8 @@
|
|
|
332
334
|
============================================================ -->
|
|
333
335
|
<figure>
|
|
334
336
|
<div class="canvas">
|
|
335
|
-
<svg id="ill-fanout" xmlns="http://www.w3.org/2000/svg" width="720" height="320" viewBox="0 0 720 320">
|
|
337
|
+
<svg id="ill-fanout" xmlns="http://www.w3.org/2000/svg" width="720" height="320" viewBox="0 0 720 320" role="img" aria-labelledby="svg-fanout-title">
|
|
338
|
+
<title id="svg-fanout-title">Fan-out diagram showing an enqueue batch dispatching to multiple parallel worker lanes for concurrent job processing</title>
|
|
336
339
|
<defs>
|
|
337
340
|
<style>
|
|
338
341
|
.m { font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace; font-size: 11px; }
|
|
@@ -471,7 +474,7 @@
|
|
|
471
474
|
</ul>
|
|
472
475
|
</section>
|
|
473
476
|
|
|
474
|
-
</
|
|
477
|
+
</main>
|
|
475
478
|
|
|
476
479
|
<script>
|
|
477
480
|
document.querySelectorAll('.dl').forEach(function (btn) {
|
|
@@ -302,7 +302,7 @@
|
|
|
302
302
|
</style>
|
|
303
303
|
</head>
|
|
304
304
|
<body>
|
|
305
|
-
<
|
|
305
|
+
<main class="page">
|
|
306
306
|
|
|
307
307
|
<header>
|
|
308
308
|
<div class="header-top">
|
|
@@ -523,6 +523,6 @@
|
|
|
523
523
|
— generated Mar 16 2025 18:02
|
|
524
524
|
</footer>
|
|
525
525
|
|
|
526
|
-
</
|
|
526
|
+
</main>
|
|
527
527
|
</body>
|
|
528
528
|
</html>
|
|
@@ -393,7 +393,7 @@
|
|
|
393
393
|
<a href="#actions">Action items</a>
|
|
394
394
|
</nav>
|
|
395
395
|
|
|
396
|
-
<
|
|
396
|
+
<main class="page">
|
|
397
397
|
|
|
398
398
|
<header>
|
|
399
399
|
<div class="inc-id">INC-2025-0412</div>
|
|
@@ -591,6 +591,6 @@
|
|
|
591
591
|
Authored from on-call notes + alert history · reviewed by Devon Park, Mira Okafor
|
|
592
592
|
</footer>
|
|
593
593
|
|
|
594
|
-
</
|
|
594
|
+
</main>
|
|
595
595
|
</body>
|
|
596
596
|
</html>
|
|
@@ -158,7 +158,7 @@
|
|
|
158
158
|
</style>
|
|
159
159
|
</head>
|
|
160
160
|
<body>
|
|
161
|
-
<
|
|
161
|
+
<main class="sheet">
|
|
162
162
|
|
|
163
163
|
<header>
|
|
164
164
|
<div class="eyebrow">Illustrations & Diagrams · Flowchart</div>
|
|
@@ -173,7 +173,8 @@
|
|
|
173
173
|
|
|
174
174
|
<div>
|
|
175
175
|
<div class="canvas">
|
|
176
|
-
<svg class="flow" viewBox="0 0 620 920">
|
|
176
|
+
<svg class="flow" viewBox="0 0 620 920" role="img" aria-labelledby="svg-flow-title">
|
|
177
|
+
<title id="svg-flow-title">Deploy pipeline flowchart for git push main showing CI steps, test gates, image build, deploy stages, and rollback path</title>
|
|
177
178
|
<defs>
|
|
178
179
|
<marker id="arrow" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="6" markerHeight="6" orient="auto-start-reverse">
|
|
179
180
|
<path d="M0,0 L10,5 L0,10 z" fill="#87867F"/>
|
|
@@ -293,7 +294,7 @@
|
|
|
293
294
|
</aside>
|
|
294
295
|
|
|
295
296
|
</div>
|
|
296
|
-
</
|
|
297
|
+
</main>
|
|
297
298
|
|
|
298
299
|
<script>
|
|
299
300
|
const DETAIL = {
|
|
@@ -191,7 +191,7 @@
|
|
|
191
191
|
|
|
192
192
|
<div class="demo">
|
|
193
193
|
<div class="demo-grid">
|
|
194
|
-
<svg class="ring" id="ring" viewBox="0 0 260 260"></svg>
|
|
194
|
+
<svg class="ring" id="ring" viewBox="0 0 260 260" role="img" aria-labelledby="svg-ring-title"><title id="svg-ring-title">Consistent hashing ring diagram with nodes and keys placed around a circle; keys assign to the next clockwise node</title></svg>
|
|
195
195
|
<div class="controls">
|
|
196
196
|
<div class="row">
|
|
197
197
|
<label>nodes</label>
|
|
@@ -383,7 +383,7 @@
|
|
|
383
383
|
</style>
|
|
384
384
|
</head>
|
|
385
385
|
<body>
|
|
386
|
-
<
|
|
386
|
+
<main class="page">
|
|
387
387
|
|
|
388
388
|
<header class="page-head">
|
|
389
389
|
<div class="eyebrow">Implementation plan · Birchline web client</div>
|
|
@@ -462,7 +462,8 @@
|
|
|
462
462
|
<p class="sec-intro">Optimistic write path on the left, fan-out on the right. The read cursor update is fire-and-forget — we never block the thread render on it.</p>
|
|
463
463
|
|
|
464
464
|
<div class="diagram">
|
|
465
|
-
<svg viewBox="0 0 860 340" xmlns="http://www.w3.org/2000/svg">
|
|
465
|
+
<svg viewBox="0 0 860 340" xmlns="http://www.w3.org/2000/svg" role="img" aria-labelledby="svg-dataflow-title">
|
|
466
|
+
<title id="svg-dataflow-title">Data flow diagram for comment threads showing optimistic write from CommentComposer through tRPC to the database and realtime fan-out to subscribers</title>
|
|
466
467
|
<defs>
|
|
467
468
|
<marker id="arrow" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
|
|
468
469
|
<path d="M0,0 L10,5 L0,10 z" fill="#87867F"/>
|
|
@@ -697,6 +698,6 @@
|
|
|
697
698
|
</div>
|
|
698
699
|
</section>
|
|
699
700
|
|
|
700
|
-
</
|
|
701
|
+
</main>
|
|
701
702
|
</body>
|
|
702
703
|
</html>
|
|
@@ -291,7 +291,7 @@
|
|
|
291
291
|
</style>
|
|
292
292
|
</head>
|
|
293
293
|
<body>
|
|
294
|
-
<
|
|
294
|
+
<main class="wrap">
|
|
295
295
|
|
|
296
296
|
<header>
|
|
297
297
|
<div class="eyebrow">Birchline / editor / triage</div>
|
|
@@ -314,7 +314,7 @@
|
|
|
314
314
|
|
|
315
315
|
<div class="board" id="board"></div>
|
|
316
316
|
|
|
317
|
-
</
|
|
317
|
+
</main>
|
|
318
318
|
|
|
319
319
|
<script>
|
|
320
320
|
// ---------- data ----------
|
|
@@ -302,7 +302,7 @@
|
|
|
302
302
|
</style>
|
|
303
303
|
</head>
|
|
304
304
|
<body>
|
|
305
|
-
<
|
|
305
|
+
<main class="wrap">
|
|
306
306
|
|
|
307
307
|
<header>
|
|
308
308
|
<div class="eyebrow">Birchline / editor / feature-flags</div>
|
|
@@ -334,7 +334,7 @@
|
|
|
334
334
|
</aside>
|
|
335
335
|
</div>
|
|
336
336
|
|
|
337
|
-
</
|
|
337
|
+
</main>
|
|
338
338
|
|
|
339
339
|
<script>
|
|
340
340
|
"use strict";
|
|
@@ -287,7 +287,7 @@
|
|
|
287
287
|
</style>
|
|
288
288
|
</head>
|
|
289
289
|
<body>
|
|
290
|
-
<
|
|
290
|
+
<main class="wrap">
|
|
291
291
|
|
|
292
292
|
<header>
|
|
293
293
|
<div class="eyebrow">Birchline / editor / prompt-tuner</div>
|
|
@@ -328,7 +328,7 @@
|
|
|
328
328
|
|
|
329
329
|
<footer>Highlighted slots fill from each sample's ticket fields. Anything underlined in dashed clay isn't a known field and will pass through unfilled.</footer>
|
|
330
330
|
|
|
331
|
-
</
|
|
331
|
+
</main>
|
|
332
332
|
|
|
333
333
|
<script>
|
|
334
334
|
(function () {
|