You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
|`shell`|`PUBLIC_WS_URL=wss://ws.augment.didi.sh/ws`, `PUBLIC_ID_BASE=https://id.didi.sh`, `PUBLIC_STRATEGY_CURATOR_REMOTE`, `PUBLIC_CHAT_REMOTE` (all build-time — baked in via Docker `ARG`/`ENV`, not read at runtime) |
|`shell`|`PUBLIC_WS_URL=wss://ws.augment.didi.sh/ws`, `PUBLIC_ID_BASE=https://id.didi.sh`, `PUBLIC_CORPORA_CURATOR_REMOTE`, `PUBLIC_CHAT_REMOTE` (all build-time — baked in via Docker `ARG`/`ENV`, not read at runtime) |
Copy file name to clipboardExpand all lines: DESIGN.md
+4-3Lines changed: 4 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -13,6 +13,7 @@ revisions:
13
13
- 2026-08-01 — 0.0.3.2. **Architecture review remediation (Michael).** Five contradictions, four of them introduced by 2.0/2.1. **F11 restated as a prohibition on literals** — the old wording ("resolves to a Tier-1 name") flags 13 declarations against the runtime, 11 of which are the `color-mix()` idiom *Derived tokens* recommends; composition over Tier 1 **or Tier 2** is now explicitly legal. **Effect tokens settled as Tier 3** and given their own table; the Tier-2 count corrects 24 → 21, and F11 binds Tiers 2 and 3. **P1 corrected** — it said components consume Tier 2 only, which forbade the effect tokens every card uses. **Staleness compares majors**, so "2.1 is additive" is now true rather than contradicted by the schema. **Tier 4 rule 4 made checkable** — it forbade "a colour" while rule 3 mandated composing from colour tokens. Gates raised but not decided — **A20** token introduction across independent deploys (the mirror of A16 — F10 made the shell the sole injector and nothing covers a member outrunning the deployed theme), **A21** logical vs physical properties, plus owners and dates on A19 and the `warn` exit, and the eleven `product-wide` a11y defects read as federal until the audit assigns them.
14
14
- 2026-08-01 — **0.1.0.0 — Phases 0 and 1 IMPLEMENTED.** First version where the runtime moved rather than the prose. **Phase 0:** `scripts/design-drift.mjs` exists (`pnpm design:drift`) — the F1–F11 checks and the contrast measurement, zero dependencies, reading the member registry from this document's frontmatter. **Until now F1–F11 were prose; they are now checks.** **Phase 1:** ten missing colour tokens shipped in all three mode blocks; `--color-bg` aliased (closing 43 declarations that painted nothing in production); the four phantom warn dialects unified; `--focus-ring` added and the `strategy-curator` light-mode focus defect closed; global `prefers-reduced-motion` and `forced-colors` blocks; the shell's inline FOUC guard. **A19 resolved** — the three ramps renumbered so step numbers track lightness, verified a pure permutation by `--resolve` diff. **F11 debt cleared.** **R11 fired and was fixed:** contrast measurement found five real light-mode failures; `--color__ink-500` and `--color__amber-ink` darkened, and **all 108 text-on-surface pairs now pass 4.5:1**. **`--color-text-dim` rejected** — no legal value exists below muted in light. New gate **A22** — `--color-border` measures 1.2–1.5:1 and does not meet 3:1 for control boundaries.
15
15
- 2026-08-01 — 0.1.0.1. **Post-implementation review remediation.** The Phase 1 review found the code sound and **the document wrong in seven places** — it still described the palette as it was before Phase 1 changed it. Worst case — §Colors warned the ramps were non-monotonic and cited `--color__graphite-700` as `#13151b`, when it is now `#232634`, **so an agent reading the document got the wrong hex**. Also corrected — the A19 block still offering two options "neither yet chosen"; the Tier-1 table missing the five tokens Phase 1 added; the Elevation ladder marking three shipped tokens 🔶; the effect-token table listing 3 of 4 and still claiming the F11 debt was open; the frontmatter `colors:` block missing all 10 new tokens; and the Tier-2 table having no role rows for them. **Root cause — nothing checks the document against the runtime** — the drift script compares CSS to CSS. Added **F1a** to the drift script, which catches a member *consuming* a Tier-1 name (F1 only caught *declaring* one); it found three real violations, all reading `var(--font__mono)` instead of `--font-mono`, now fixed. **That check would have caught a near-miss — A19 was safe only because it happened not to touch the font tokens.**
16
+
- 2026-08-08 — 0.1.0.2. **`strategy-curator` → `corpora-curator`, prefix `sc` → `cc`.** Registry row and member table updated; 383 class occurrences across 56 names renamed in lockstep with the gallery catalog's `rootClass`, so the F2/F3 containment audit stays at zero. The app was never strategy-specific — `strategy` is one of `strategy | topic | thesis | market-segment | category`, and humain-vc has only ever run it on `thesis`. **The domain-type vocabulary was deliberately NOT renamed**: it is a data value in two external client submodules, in per-client `DEFAULT_DOMAIN_TYPE`, and in on-disk folder names. Earlier revision entries and the closed-defect log keep the old name on purpose — they record what was true when written. See [[context-v/refactors/Rename-Strategy-Curator-To-Corpora-Curator.md]].
|`chat`|`chat`|`.chat-app`| 4 | Mode variants, constrained-width column |**A**| med |[[apps/chat/DESIGN.md]]|
1007
-
|`strategy-curator`|`sc`|`.sc-app`| 4 | Hairline source rows, tag bar |**B**| high |[[apps/strategy-curator/DESIGN.md]]|
1008
+
|`corpora-curator`|`cc`|`.cc-app`| 4 | Hairline source rows, tag bar |**B**| high |[[apps/corpora-curator/DESIGN.md]]|
1008
1009
|`record-collector`|`rc`|`.rc-app`| 2 |`auto-fit` card grid, family grouping |**B**| low |[[apps/record-collector/DESIGN.md]]|
1009
1010
|`pack-runner`|`pr`|`.pr-app`| 2 | The run row |**B**| high |[[apps/pack-runner/DESIGN.md]]|
1010
1011
|`enhanced-records-list`|`erl`|`.erl-app`| 0 |**The only real `<table>`**|**B**| low |[[apps/enhanced-records-list/DESIGN.md]]|
@@ -1596,7 +1597,7 @@ apps/<name>/
1596
1597
**Don't** hand-roll an overlay. Eight were; zero trap focus, zero restore it, five cannot be closed with Escape.
1597
1598
1598
1599
**Do** give every input a real `<label for>`.
1599
-
**Don't** style a `<span>` to look like a label. That pattern exists here deliberately — the CSS styles `label` and `.sc-label` identically — and it produces controls a screen reader cannot name.
1600
+
**Don't** style a `<span>` to look like a label. That pattern exists here deliberately — the CSS styles `label` and `.cc-label` identically — and it produces controls a screen reader cannot name.
1600
1601
1601
1602
**Do** announce state changes with a live region.
1602
1603
**Don't** assume a visible banner is a communicated banner. This product has two live regions and neither is an error.
-**Lenses.** A *lens* is a federated remote that re-presents the active record set under a different affordance shape — sort/filter, inline-edit, per-row corpus add — without leaving the record. `sort-filter-lens` is the first; registered as a third member of `AUGMENT_COMPOSITE` alongside PTM + Pack Runner. Lenses auto-fall-back to the newest non-archived record set when localStorage points at an archived one, so they survive `/promote-snapshot` cleanly.
107
107
-**Funder-content corpus.** Per-client, per-funder directory of source materials backing each row. Two entry vectors land into the same shape: the chat `/inbox <url>` verb (with active-client context) and the per-row inline "+ URL" affordance in the lens. Both run fire-and-forget through `services/content-ingest/`, Jina-extract markdown, preserve original PDFs as LFS binaries, and stamp `record_uuid` + `published_at` into frontmatter. Manual-paste URLs land regardless of domain (operator curation trumps the same-host rule, which only binds pack outputs).
108
108
-**Corpus chips tell the truth.**`corpus.list_for_record` joins by `corpus_funder_slug` as primary (one dir scan) with `record_uuid` lineage as fallback — chips stay accurate across `/promote-snapshot` cuts. `/promote-snapshot` itself derives `corpus_*` columns from filesystem state when cutting a new record set, and stitches `predecessor_record_set_id` for lineage walks.
109
-
-**The canonical layer — a second, DB-first way to build a corpus.** Every flow above starts from an uploaded CSV. `strategy-curator` ("Corpora Curator" in the UI) starts the other direction: pick or create a **domain** — a `type`-discriminated grouping (`strategy`, `thesis`, `topic`, `market-segment`, …) stored in SurrealDB, not the filesystem — and gather **sources** into it (Jina-fetched metadata, full-content fetch, tags, pasted extracts). `record-surrealdb-resolver` owns the DB side (the `domains`/`sources`/`source_usages` tables plus `persons`/`organizations`/`affiliations`); `content-ingest` mirrors every write to an on-disk corpus file. `person-db-resolver`, `record-db-resolver`, and `affiliation-rating-resolver` are the sibling canonical-layer flows — matching/creating people and organizations, then rating the relevance of the affiliation between them — all writing into the same shared entity graph rather than a per-upload CSV schema.
109
+
-**The canonical layer — a second, DB-first way to build a corpus.** Every flow above starts from an uploaded CSV. `corpora-curator` ("Corpora Curator" in the UI) starts the other direction: pick or create a **domain** — a `type`-discriminated grouping (`strategy`, `thesis`, `topic`, `market-segment`, …) stored in SurrealDB, not the filesystem — and gather **sources** into it (Jina-fetched metadata, full-content fetch, tags, pasted extracts). `record-surrealdb-resolver` owns the DB side (the `domains`/`sources`/`source_usages` tables plus `persons`/`organizations`/`affiliations`); `content-ingest` mirrors every write to an on-disk corpus file. `person-db-resolver`, `record-db-resolver`, and `affiliation-rating-resolver` are the sibling canonical-layer flows — matching/creating people and organizations, then rating the relevance of the affiliation between them — all writing into the same shared entity graph rather than a per-upload CSV schema.
110
110
- **Augment from DB — the org-first workbench.** The newest canonical-layer flow inverts the CSV pipeline completely: start from an **organization already in SurrealDB**. `org-workbench` autocompletes to an org (names, aliases, or domains), then shows one card that views AND edits in place — identity/social links, pulse streams (`media_streams`), corpus items, and a reveal of every affiliated person with nested links of their own. Adding a person generates the `affiliations` edge + observation automatically (`person.affiliate`, org pre-bound — no affiliation UI needed, N orgs per person by construction). Every list carries a 🔍 that opens `search-and-add` in a paired tile: the search term stays always-editable, providers swap via the registry palette (SearXNG default, Exa a chip away), and each result row one-click-adds to exactly the list that launched the search. Streams go further — a per-stream **scan** fires the entity-pulse blog machinery at the stream URL and badges anything already in the `content_items` ledger, so "what's new on their blog" is one click and only genuinely-new items get added. Spec: `context-v/specs/Augment-From-DB-Flow.md` (Shipped).
111
111
-**Live multi-operator sync.** Domain and source mutations on the canonical layer broadcast over NATS (`domain.created`, `source.added`, …); every connected session in the same workspace refetches automatically. Two people signed into the same client see each other's edits without a refresh.
112
112
-**didi.sh identity + actor attribution.** Sign-in is magic-link only (no passwords, invite-only), via the shared `id.didi.sh` service — one account works across this app and its sibling Lossless VC-tooling apps. A signed-in session's `didi_id` rides every capability call and gets stamped as `created_by`/`updated_by` on canonical writes (DB rows and corpus frontmatter alike), so every mutation on the canonical layer carries who did it. The in-app chat agent ("didi") writes through the same envelope, tagged `via: didi-agent`, so an agent-driven edit is distinguishable from a manual one.
@@ -171,7 +171,7 @@ Run a single group directly with `pnpm test` in its package:
0 commit comments