Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
125 commits
Select commit Hold shift + click to select a range
de1cc94
docs(5c): research + design + proposed 3-run plan (UI end product)
rickylabs Jun 11, 2026
ff38be0
docs(5c): record hand-off commit hash de1cc94
rickylabs Jun 11, 2026
0ab2063
docs(5c): aggregate dependency + pattern extracts
rickylabs Jun 11, 2026
7ecf7ea
docs(5c): plan-eval matrix + decision verdicts
rickylabs Jun 11, 2026
2c1fa23
docs(5c): design deepening (scaffold spec, registry v2, token pipelin…
rickylabs Jun 11, 2026
dfe7ce2
docs(5c): plan v2 amendments + re-sliced runs 2-3 + LOCK
rickylabs Jun 11, 2026
cda1c60
docs(5c): record hashes + drift entries
rickylabs Jun 11, 2026
50c8a41
Bootstrap 5c1 UI foundation run artifacts
rickylabs Jun 11, 2026
88d3acb
Record 5c1 bootstrap commit hash
rickylabs Jun 11, 2026
d2e1a9f
Measure 5c1 fresh-ui baseline
rickylabs Jun 11, 2026
746463c
Record 5c1 baseline commit hash
rickylabs Jun 11, 2026
047558c
Replace fresh-ui brittle check file list
rickylabs Jun 11, 2026
d6cb2da
Record slice 1 evidence
rickylabs Jun 11, 2026
4ea5103
Transcribe fresh-ui tokens to DTCG source
rickylabs Jun 11, 2026
34b5282
Record slice 2 evidence
rickylabs Jun 11, 2026
bf4465f
Build fresh-ui tokens with Style Dictionary
rickylabs Jun 11, 2026
9509b7c
Record slice 3 evidence
rickylabs Jun 11, 2026
15a13e0
Generate Tailwind theme bridge artifacts
rickylabs Jun 11, 2026
c4467c0
Record slice 4 evidence
rickylabs Jun 11, 2026
42b9b92
Add fresh-ui token drift fitness gate
rickylabs Jun 11, 2026
122869a
Record slice 5 evidence
rickylabs Jun 11, 2026
999fdf9
Migrate fresh-ui registry schema to v2
rickylabs Jun 11, 2026
e6d473b
Record slice 6 evidence
rickylabs Jun 11, 2026
6977b9b
Add fresh-ui manifest integrity gate
rickylabs Jun 11, 2026
91a01ee
Record slice 7 evidence
rickylabs Jun 11, 2026
097fde8
Extract fresh-ui component CSS per registry item
rickylabs Jun 11, 2026
c24ee22
Record slice 8 evidence
rickylabs Jun 11, 2026
c256bdb
Add fresh-ui L0 primitives surface
rickylabs Jun 11, 2026
d965c4d
Record slice 9 evidence
rickylabs Jun 11, 2026
ac0e1a3
Record Fresh Zag spike evidence
rickylabs Jun 11, 2026
e2537bb
Record slice 10 evidence
rickylabs Jun 11, 2026
bdaebad
Render accordion with native details
rickylabs Jun 11, 2026
cbaea4c
Record slice 11 evidence
rickylabs Jun 11, 2026
802e001
Use platform popover for floating runtimes
rickylabs Jun 11, 2026
a10b6d7
Record slice 12 evidence
rickylabs Jun 11, 2026
9c2a38b
Add Fresh UI init command
rickylabs Jun 11, 2026
86121a4
Record slice 13 evidence
rickylabs Jun 11, 2026
b03f590
Add Fresh UI add command
rickylabs Jun 11, 2026
3cb2dbb
Record slice 14 evidence
rickylabs Jun 11, 2026
aaf043d
Derive fresh-ui color ramps with OKLCH
rickylabs Jun 11, 2026
fb278c8
Record slice 15 evidence
rickylabs Jun 11, 2026
2d76d21
Prepare fresh UI package for JSR exit
rickylabs Jun 11, 2026
24e9d3d
Record slice 16 evidence
rickylabs Jun 11, 2026
d9e89a3
Record final 5c1 hash evidence
rickylabs Jun 11, 2026
ef34f27
Resolve Zag hydration closeout evidence
rickylabs Jun 11, 2026
0381d8c
Record Zag hydration closeout hash
rickylabs Jun 11, 2026
ace648f
chore(openhands): apply agent changes
openhands-agent Jun 11, 2026
652c0bc
Merge pull request #31 — Run 5c1 Composition foundation (IMPL-EVAL PASS)
rickylabs Jun 11, 2026
fb71ddd
Bootstrap run 5c2 design-system run dir
rickylabs Jun 11, 2026
2a1b378
Slice 1: Reconcile button + toast CSS with token-based color-mix
rickylabs Jun 11, 2026
3fb5098
Record MEASURE-FIRST baseline and Run 2 lock decision
rickylabs Jun 11, 2026
57d1825
Update worklog with slice 1 evidence
rickylabs Jun 11, 2026
7c5dffc
Slice 2: Replace raw rgba in layouts.css with token-based color-mix
rickylabs Jun 11, 2026
ae29999
Slice 1 cont: Clean remaining raw rgba in form-control-styles + sheet
rickylabs Jun 11, 2026
9a1f971
Reconcile run bookkeeping at takeover (worklog slices 1-cont/2, commi…
rickylabs Jun 11, 2026
7c09c06
Slice 2 cont: Extract layout-objects style item; complete step-0 audit
rickylabs Jun 11, 2026
d33b9ff
Record slice 2 cont commit hash in commits.md
rickylabs Jun 11, 2026
61b29e5
Slice 3a: Theme-parameterize ui:init/ui:add
rickylabs Jun 12, 2026
372484e
Fix slice-1 regression: dedupe .ns-btn opening line in registry butto…
rickylabs Jun 12, 2026
7c7863a
Slice 3: Extend ui-init smoke driver with extra-items and theme args
rickylabs Jun 12, 2026
b54e353
Fix: runtime components annotated ': unknown' break JSX consumers (TS…
rickylabs Jun 12, 2026
e4aa7b0
Slice 3 bookkeeping: worklog, drift D-5c2-2, commits.md
rickylabs Jun 12, 2026
516ebb1
Untrack run-dir smoke scratch output (regenerable via ui-init-smoke d…
rickylabs Jun 12, 2026
c9b132e
Slice 4 bookkeeping: tokens browser evidence, drift D-5c2-3, commits
rickylabs Jun 12, 2026
2c220e3
Record slice 5 evidence: /design/components gallery + drift D-5c2-4
rickylabs Jun 12, 2026
47cc116
Record slice 6 evidence (composition rules page)
rickylabs Jun 12, 2026
fd9b41a
Slice 7: ds-no-raw-hex fitness gate + consumer JSX render typecheck
rickylabs Jun 12, 2026
7fbe8e5
Record slice 7 evidence (ds-no-raw-hex gate)
rickylabs Jun 12, 2026
9cf8bea
Slice 8: ds-color-utilities fitness gate (off-vocabulary Tailwind col…
rickylabs Jun 12, 2026
3cba0e6
Record slice 8 evidence (ds-color-utilities gate)
rickylabs Jun 12, 2026
1d7b305
Slice 9: fmt-normalize registry sources, reconcile copies, add reduce…
rickylabs Jun 12, 2026
8a01349
Record slice 9 evidence in run artifacts
rickylabs Jun 12, 2026
571ecca
Slice 10: rewrite README and docs as the final-form package contract
rickylabs Jun 12, 2026
c45dedd
Record slice 10 evidence
rickylabs Jun 12, 2026
48a9ec6
Slice 11: fmt-normalize package runtime + root modules and docs
rickylabs Jun 12, 2026
5504836
Record slice 11 evidence
rickylabs Jun 12, 2026
73bf9ea
Record slice 12 evidence; Run 2 unit complete
rickylabs Jun 12, 2026
adbe881
Add fresh-ui doctrine cleanup plan + horizontal-implementation handov…
rickylabs Jun 12, 2026
9d76cca
Track design and impeccable skills (user-approved)
rickylabs Jun 12, 2026
12720b0
Plan addendum: C-11 docs scaffold + doctests, C-12 Zag adoption ADR
rickylabs Jun 12, 2026
049711f
Plan: add .llm/tmp/docs research cache as resources
rickylabs Jun 12, 2026
b3cc69c
harness: lock run3 fresh-ui scaffold plan
rickylabs Jun 12, 2026
0b548b6
harness: record run3 plan commit
rickylabs Jun 12, 2026
24fda69
harness: note prior zag proof for plan eval
rickylabs Jun 12, 2026
b066935
harness: record zag note commit
rickylabs Jun 12, 2026
80dd925
chore(openhands): apply agent changes
openhands-agent Jun 12, 2026
7fdd01b
chore(openhands): record run trace 27412819714-1
openhands-agent Jun 12, 2026
52a9ab2
fresh-ui: unify package deno config
rickylabs Jun 12, 2026
007f7d3
harness: record fresh-ui config slice
rickylabs Jun 12, 2026
17f4103
fresh-ui: track package lock
rickylabs Jun 12, 2026
9feeab7
harness: record fresh-ui lock slice
rickylabs Jun 12, 2026
84558e0
fresh-ui: move registry support files out of payload
rickylabs Jun 12, 2026
8102fa2
harness: record fresh-ui registry payload slice
rickylabs Jun 12, 2026
986e889
harness: record fresh-ui visual style slice
rickylabs Jun 12, 2026
c7014af
fresh-ui: consolidate tests and align version
rickylabs Jun 12, 2026
8b70657
harness: record fresh-ui test layout slice
rickylabs Jun 12, 2026
b9ccc7b
fresh-ui: promote package fmt and ds gates
rickylabs Jun 12, 2026
7f9a9f2
harness: record fresh-ui fmt gate slice
rickylabs Jun 12, 2026
c4ac8ff
fresh-ui: record zag adoption adr
rickylabs Jun 12, 2026
5f30d8f
harness: record zag adr slice
rickylabs Jun 12, 2026
95b5d0c
fresh-ui: add responsive table block
rickylabs Jun 12, 2026
b3da388
harness: record responsive table slice
rickylabs Jun 12, 2026
da7091f
fresh-ui: add docs scaffold and doctests
rickylabs Jun 12, 2026
d73a3c2
harness: record docs scaffold slice
rickylabs Jun 12, 2026
0974230
agents: remove legacy standards shim
rickylabs Jun 12, 2026
5cdbe1f
harness: record standards shim cleanup
rickylabs Jun 12, 2026
3f3db55
fresh-ui: document interactive entrypoint module
rickylabs Jun 12, 2026
18c02fa
harness: record jsr readiness slice
rickylabs Jun 12, 2026
c424dd6
docs: audit scaffold fresh-ui gaps
rickylabs Jun 12, 2026
1d1a332
harness: record scaffold audit slice
rickylabs Jun 12, 2026
cd30ffd
cli: install fresh-ui registry during scaffold
rickylabs Jun 12, 2026
49f1864
harness: record scaffold ui install slice
rickylabs Jun 12, 2026
8edbd45
cli: scaffold fresh-ui design routes
rickylabs Jun 12, 2026
b8b2bac
harness: record scaffold design routes slice
rickylabs Jun 12, 2026
fa71f95
cli: rebuild scaffold app pages on fresh-ui
rickylabs Jun 12, 2026
d7b5066
harness: record scaffold app pages slice
rickylabs Jun 12, 2026
4bf05eb
harness: record scaffold e2e proof
rickylabs Jun 12, 2026
2a5b546
harness: record scaffold e2e commit
rickylabs Jun 12, 2026
f07db89
harness: record final readiness
rickylabs Jun 12, 2026
586a2fb
harness: record final readiness commit
rickylabs Jun 12, 2026
f634737
chore(openhands): apply agent changes
openhands-agent Jun 12, 2026
d66d3ee
chore(openhands): record run trace 27429196329-1
openhands-agent Jun 12, 2026
7fa5b7b
chore(openhands): record run trace 27433712260-1
openhands-agent Jun 12, 2026
c65d3cd
Merge pull request #32 from rickylabs/feat/package-quality-wave5-apps…
rickylabs Jun 12, 2026
c64cb16
Merge umbrella (post-5a/5b) into 5c: reconcile deno.json root gates
rickylabs Jun 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
15 changes: 7 additions & 8 deletions .agents/skills/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,13 @@ operate this codebase end-to-end without re-deriving the API from documentation

## What's in the box

| Skill | Scope | Status |
| --------------------- | ----------------------------------------------------------------------------------------------- | ------ |
| `netscript-doctrine` | **CORE** — Navigate the architecture doctrine for `packages/` and `plugins/`. | active |
| `netscript-harness` | **CORE** — Orchestrate harness-mode runs (8-phase model, Plan-Gate, dual evaluators). | active |
| `jsr-audit` | **CORE** — Audit packages for JSR readiness. Required Plan-Gate input for package/plugin waves. | active |
| `deno-fresh` | Frontend development with Fresh 2.x, Preact, and Tailwind CSS in Deno. | active |
| `rtk` | Token-saving CLI proxy. Prefix read-heavy git/gh/grep/ls/docker commands with `rtk`; `rtk proxy` for `deno task`. | active |
| `netscript-standards` | **LEGACY** — Superseded by `netscript-doctrine`. Do not use for new work. | legacy |
| Skill | Scope | Status |
| -------------------- | ----------------------------------------------------------------------------------------------------------------- | ------ |
| `netscript-doctrine` | **CORE** — Navigate the architecture doctrine for `packages/` and `plugins/`. | active |
| `netscript-harness` | **CORE** — Orchestrate harness-mode runs (8-phase model, Plan-Gate, dual evaluators). | active |
| `jsr-audit` | **CORE** — Audit packages for JSR readiness. Required Plan-Gate input for package/plugin waves. | active |
| `deno-fresh` | Frontend development with Fresh 2.x, Preact, and Tailwind CSS in Deno. | active |
| `rtk` | Token-saving CLI proxy. Prefix read-heavy git/gh/grep/ls/docker commands with `rtk`; `rtk proxy` for `deno task`. | active |

> **Not yet in this repo.** These skills exist in the broader NetScript toolkit but are not present
> in this repository yet — do not assume their guidance is loadable here: `deno-expert`,
Expand Down
55 changes: 55 additions & 0 deletions .agents/skills/design/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
---
name: frontend-design
description: Guidance for distinctive, intentional visual design when building new UI or reshaping an existing one. Helps with aesthetic direction, typography, and making choices that don't read as templated defaults.
license: Complete terms in LICENSE.txt
---

# Frontend Design

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.

## Ground it in the subject

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.

## Design principles

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 if that's truly the best option.

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.

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 if choices like numbered markers actually make sense before incorporating them.

Leverage motion deliberately. Think about where and if 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. However, sometimes less is more, and extra animation contributes to the feeling that the design is AI-generated.

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.

Consider written content carefully. Often a design brief may not contain real content, and it's up to you to come up with copy. Copy can make a design feel as templated as the design itself. See the below section on writing for more guidance.

## Process: brainstorm, explore, plan, critique, build, critique again

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 human designer who's hired, there's often a careful balance between doing what you're good at and taking each project as a chance to experiment and learn.

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 that's 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 that embodies the brief in an appropriate way.

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, 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.

When writing the code, be careful of structuring your CSS selector specificities. It's easy to generate CSS classes that cancel each other out (especially with a type-based selector like .section and a element-based selector like .cta). This can happen often with paddings/margins between sections.

Try to do a lot of this planning and iteration in your thinking, and only show ideas to the user when you have higher confidence it'll delight them.

## Restraint and self-critique

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. Consider Chanel's advice: before leaving the house, take a look in the mirror and remove one accessory. Human creators have memory and always try to do something new, so if you have a space to quickly jot down notes about what you've tried, it can help you in future passes.

## More on writing in design

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 would 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.

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.

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.

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.

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.
96 changes: 96 additions & 0 deletions .agents/skills/fresh-ui-horizontal/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
# SKILL: fresh-ui horizontal implementation (registry → scaffolded UI page)

Audience: a follower model (e.g. GPT 5.5) executing design-system slices
for `@netscript/fresh-ui` under Harness v2. Follow these rules literally;
when reality diverges, append to the run's `drift.md` — never improvise
silently.

## Authority chain

1. `packages/fresh-ui/docs/l0-conventions.md` — the L0 contract (layers,
attributes, token rule, motion rule, copy fidelity).
2. `packages/fresh-ui/docs/theme-authoring.md` — the theme contract.
3. `packages/fresh-ui/README.md` — surface, catalog, validation commands.
4. The LOCKED slice table in the run's `plan.md` — never rescope a locked
slice; out-of-scope findings become drift entries, not work.

## The horizontal loop (one component, end to end)

Each horizontal slice carries a component from registry source to a
validated page in the consuming app. Stages, in order — no stage may be
skipped:

1. **Registry source** (framework worktree, `packages/fresh-ui/registry/`)
- L2 component: `components/ui/<name>.tsx` + `<name>.css`. May import
L0/L1 and `lib/` — NEVER another L2 file.
- CSS uses only `--ns-*` variables and `color-mix()` over them; class
vocabulary `ns-<block>`, `ns-<block>__<part>`, `ns-<block>--<mod>`.
- Every animation declares reduced-motion behavior (motion rule).
- Register the item in `registry/manifest.ts` (kind, layer, files,
dependencies, collections).
2. **Package gates** (from `packages/fresh-ui/`):
`deno task check` · `deno task test` · and from the workspace root
`deno run --allow-read .llm/tools/fitness/check-ds-no-raw-hex.ts` and
`...check-ds-color-utilities.ts`. New gates get a negative test:
inject a violation, prove FAIL + exit 1, revert, prove PASS.
3. **Copy to consumer** (repo-genesis worktree): registry tsx →
`apps/playground/components/ui/`, css → `apps/playground/assets/ui/`,
islands → `apps/playground/islands/ui/` (rewrite relative import depth
`../lib/` → `../../lib/`; that is the ONLY allowed content change).
Verify with `diff --strip-trailing-cr` (checkouts are CRLF; bytes
differ legitimately). Also sync the framework package copy at
repo-genesis `packages/fresh-ui/`.
4. **Page integration**: add the component to the gallery route
`apps/playground/routes/(design)/design/components.tsx` (every
variant/size/state), and to the relevant app page if the slice says so.
Import CSS via the styles aggregator, not inline.
5. **Browser gate on the REAL route** (Playwright, dev server from
`apps/playground`, port printed by vite): SSR 200 + zero console
errors; theme flip via `button[aria-label="Switch to dark mode"]` both
ways with computed-style assertions; 390×844 viewport with
`scrollWidth <= innerWidth` and per-element offender scan;
`page.emulateMedia({ reducedMotion: 'reduce' })` if the component
animates.
6. **Tests**: unit tests beside the runtime/lib code; if the public
surface changed, extend `consumer-render.test.tsx` with a
consumer-shaped JSX tree.

## Commit & evidence discipline (Harness v2)

- One slice = one impl commit per repo + bookkeeping commit. NEVER amend;
follow-ups are new commits, hash-recorded.
- Trailer on every commit: `Co-Authored-By: <model attribution line>`.
- Append (never rewrite) `worklog.md`, `commits.md`, `drift.md` in
`.llm/tmp/run/<run-id>/`.
- Per-slice PR comment with a Gate(s) / Changed / Drift / Commits table.
- Push both repos after every slice.

## Environment gotchas (verified, will bite you)

- Root `deno.lock` gets mutated by the dev server: restore with
`git checkout -- deno.lock` before staging. NEVER delete locks or run
`deno cache --reload`. `git add -A packages/fresh-ui` stages the
untracked package `deno.lock` — unstage it.
- Targeted `deno check` needs `--unstable-kv`; package tasks use
`--config deno.gates.json --no-lock`.
- fmt: root config excludes the package; use
`deno fmt --no-config --indent-width 2 --line-width 100 --single-quote`
for package CSS/md until the config is unified (doctrine plan C-7).
- rtk shell proxy: `rg` not on PATH, compound `find` predicates fail,
`cat`-based diffs can error misleadingly — use plain Bash, absolute
paths, `cmp -s` / `diff --strip-trailing-cr`.
- Token vocabulary: it is `--ns-muted-fg` (NOT `--ns-fg-muted`). Check
names against `registry/theme/tokens.css` before writing CSS.
- Bash cwd resets to the framework worktree after every command; always
`cd` with absolute paths.
- `gh` CLI unavailable: use the GitHub MCP `add_issue_comment` for PR
comments. Raw `git` (not rtk) for verdict-bearing reads.

## Hard prohibitions

- No self-evaluation, no merging, no editing locked plan tables.
- No raw colors / stock Tailwind palette utilities in components (gates
enforce; allow markers `ds-allow-raw-color` / `ds-allow-color-utility`
only with a documented platform reason).
- No L2→L2 imports; shared behavior goes down (L0/L1), composition up (L3).
- No new dependencies without checking Web Platform / `@std/*` first.
Loading