Skip to content

Commit e5c30f4

Browse files
mpstatonclaude
andcommitted
new(context-v, issues): jot the three post-v1 debts — liveness/error surfacing, the deferred TDD floor, and the missing component library
Three journey-log issues filed before the next arc, tagged per the operator's triage: Usability+Error (dead-feeling clicks with five indistinguishable causes and no everything-is-fine view), Oversight (zero automated tests despite TDD being the natural fit for iterate-until-green agentic work — the prove-scripts are proto-tests pointing the way), and Oversight+Usability (fourteen remotes of improvised UI with at least six near-duplicate organs inventoried, bounded by the no-cross-app-dependency rule but with the intra-repo packages/shared-ui path open). Each file captures symptom, what exists today, candidate directions, and open questions — deliberately jotted, not decided. The three cross-reference each other where they interlock (tests guard pre-ship vs liveness guards runtime; extract-components-without-tests risk). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014zrFkWSVgTkoQyiobdBjrd
1 parent 0e57a70 commit e5c30f4

3 files changed

Lines changed: 275 additions & 0 deletions
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
---
2+
title: "Live/not-live indicator tooling — parts of the UI feel dead, and there's no single view that says whether everything is actually working"
3+
lede: "Clicking a Flow, a button, a chip sometimes does nothing, and the operator can't tell whether the remote is down, the service is down, the capability errored silently, or the click genuinely did nothing. The app needs liveness indicators in the chrome and at least one everything-is-fine view — plus error logging that actually surfaces across services and frontends."
4+
date_created: 2026-07-24
5+
date_modified: 2026-07-24
6+
authors:
7+
- Michael Staton
8+
augmented_with:
9+
- Claude Code on Claude Fable 5
10+
semantic_version: 0.0.0.1
11+
tags:
12+
- Issue
13+
- Usability
14+
- Error
15+
- Augment-It
16+
- Observability
17+
- Liveness
18+
- Error-Surfacing
19+
- Shell
20+
status: Open · Jotted
21+
---
22+
23+
# Live/not-live indicator tooling + cross-service error surfacing
24+
25+
## The symptom
26+
27+
Using the application, some options feel **"dead"** — clicking a Flow in the
28+
popdown, clicking a button, firing an action sometimes produces nothing
29+
visible. No spinner, no error, no state change. The operator is left
30+
guessing which of at least five different failures it was:
31+
32+
1. The federated remote isn't running (dev server down on its port) — the
33+
shell mounts nothing or errors quietly.
34+
2. The remote mounted but its WebSocket to workspace-service is
35+
`closed`/`error` — every `workspace.invoke` dies.
36+
3. The capability crossed the wire but the backing service (or NATS, or
37+
SurrealDB) is down/erroring — reply times out or comes back `ok:false`
38+
into a code path that doesn't render it.
39+
4. The click worked and the write landed, but nothing on-screen refreshed.
40+
5. The click genuinely does nothing yet (an unwired affordance).
41+
42+
All five present identically to the operator: a dead click.
43+
44+
## What we already have (scattered, insufficient)
45+
46+
- Per-remote WS status pills (`status-open/closed/error` chrome in each
47+
app's header) — but only for the workspace socket, only per-remote, and
48+
easy to miss.
49+
- Per-widget localized error text (AdditiveList, ResultRow, etc.) — good
50+
where it exists, but only covers errors that make it back as `ok:false`.
51+
- Service-side JSON logs (`docker compose logs`) — invisible unless you go
52+
terminal-side.
53+
- The known gotcha that the shell's DevTools console scrubs
54+
Module-Federation cross-origin errors to `'Script error.'` (README §Get
55+
started) — so even the console lies about remote failures.
56+
57+
## What "fixed" plausibly looks like (directions, not decisions)
58+
59+
- **A liveness view** — one surface (a shell page, a header popover, or a
60+
didi-chat verb) showing green/red per: each federated remote's
61+
`remoteEntry.js` reachability, workspace WS, NATS, each service
62+
(heartbeat subject or `<service>.ping.requested`), SurrealDB reachability,
63+
SearXNG. "Is everything fine?" should be one glance, not six terminals.
64+
- **Chrome-level indicators** — the shell header already knows the WS
65+
state; it could aggregate remote-mount failures and show a single
66+
degraded-state badge instead of remotes failing silently into blank
67+
slots.
68+
- **Error surfacing pipeline** — capability failures (`ok:false`, timeouts)
69+
should land somewhere visible by default (toast layer? a shell-owned
70+
error rail? at minimum a dev-mode on-screen log), not just in whichever
71+
component thought to render them.
72+
- **Dead-click insurance** — every wired affordance gives immediate
73+
feedback (busy state within ~100ms) so "no reaction" reliably means
74+
"not wired or broken," never "working silently."
75+
76+
## Open questions
77+
78+
- [ ] Heartbeat convention: per-service `*.ping.requested` subjects, or a
79+
single workspace-service aggregator that checks its dependencies?
80+
- [ ] Where does the liveness view live — a shell surface, a remote of its
81+
own, or a didi chat verb (`/status`)?
82+
- [ ] Does error surfacing ride the existing WS broadcast machinery
83+
(an `error.raised` frame) or stay client-local?
84+
- [ ] Relationship to [[No-Test-Coverage-TDD-Deferred-Despite-Agentic-Fit]]
85+
— tests catch regressions before ship; liveness tooling catches
86+
environment/runtime failure after ship. Both attack "feels dead," neither
87+
substitutes for the other.
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
---
2+
title: "No component library — the UI is improvised per-remote instead of component-based, and it's starting to show"
3+
lede: "For expediency, agents have improvised working UI in each remote — and it worked, fourteen remotes' worth. But the bill is arriving: the UI is getting visually funky, near-identical widgets exist in parallel dialects (status pills, additive lists, candidate pickers, chip palettes), and a ton of code is almost certainly redundant. Time to decide what Component-Based Architecture means under this repo's copy-don't-depend rules."
4+
date_created: 2026-07-24
5+
date_modified: 2026-07-24
6+
authors:
7+
- Michael Staton
8+
augmented_with:
9+
- Claude Code on Claude Fable 5
10+
semantic_version: 0.0.0.1
11+
tags:
12+
- Issue
13+
- Oversight
14+
- Usability
15+
- Augment-It
16+
- Component-Library
17+
- Design-System
18+
- Microfrontends
19+
status: Open · Jotted
20+
---
21+
22+
# No component library — improvised UI across fourteen remotes
23+
24+
## The admission
25+
26+
Every remote's UI was improvised by agents under ship pressure. Each app
27+
namespaces its CSS (`.rc-*`, `.pdr-*`, `.ow-*`, `.saa-*`, …) and re-invents
28+
the same organs locally. It worked — fourteen shipped remotes prove it —
29+
but the compounding costs are now visible:
30+
31+
- **The UI is getting funky.** Sibling remotes solve the same problem with
32+
slightly different visuals and behaviors; the app reads as a collection
33+
of sessions, not a product.
34+
- **Redundancy.** Known near-duplicates, off the top of a scan:
35+
- WS status pill + client badge header (every remote, copied N times)
36+
- Additive URL list with ➕ form (org-workbench's `AdditiveList`;
37+
affiliation-rating-resolver's four lists; person-enrichment's
38+
`LinkList`)
39+
- Candidate pickers with score + match_reason (record-db-resolver,
40+
person-db-resolver, org-workbench's `AddPersonInline` gate)
41+
- Connector/provider chip palettes (pack-runner, response-reviewer,
42+
search-and-add)
43+
- Debounced autocomplete (person-enrichment org picker, person-db-resolver,
44+
org-workbench `OrgSearch`)
45+
- Result/source rows with one-click action (response-reviewer,
46+
strategy-curator `SourceList`, search-and-add `ResultRow`)
47+
- **Agent drift amplifies it.** Each new remote copies whichever sibling
48+
the session happened to read, forking dialects further.
49+
50+
## The constraint that shapes any fix
51+
52+
Two standing rules bound the solution space:
53+
54+
1. **No shared runtime dependency across the three ai-labs apps**
55+
(augment-it / dididecks / memopop) — patterns travel knots-style
56+
(blueprint + copy-from), never as a package across apps.
57+
2. **Within augment-it**, a shared package is allowed and precedented —
58+
`packages/shared-ui` already exists (ConfidencePill, ToggleHeader) and
59+
`packages/theme` proves the intra-repo-package path works across
60+
federation (imported per-remote at build time, no shared federation
61+
runtime).
62+
63+
So the real question is *intra-repo*: grow `packages/shared-ui` into a real
64+
component library, or codify components as copy-templates with a canonical
65+
source per organ? (Or the hybrid: primitives in shared-ui, composites as
66+
copy-templates.)
67+
68+
## Directions worth weighing (not decided)
69+
70+
- **Inventory first.** A one-session audit producing the canonical list of
71+
duplicated organs (the six above + whatever the sweep finds), each with
72+
its "best current implementation" named — that's the component library's
73+
table of contents regardless of packaging choice.
74+
- **DESIGN.md + tokens discipline.** The funkiness is partly visual drift;
75+
`packages/theme` tokens exist but per-remote CSS re-hardcodes fallbacks
76+
and spacing ad hoc. A DESIGN.md contract (per the maintain-design-md
77+
practice) would give agents the palette of *moves*, not just colors.
78+
- **Migration is incremental by construction** — remotes are federated, so
79+
each can adopt shared components one at a time; no big-bang.
80+
- **New-code rule candidate:** before writing a new widget, check the
81+
inventory; extend-or-adopt beats improvise. (Belongs in CLAUDE.md and
82+
the loop doc's plan-authoring step once the inventory exists.)
83+
84+
## Open questions
85+
86+
- [ ] `packages/shared-ui` as the home (build-time import per remote), vs
87+
copy-template canon, vs hybrid — what's the deciding criterion?
88+
(Leaning hybrid: primitives shared, flow-specific composites copied.)
89+
- [ ] Does Svelte 5 + module federation put any real constraint on sharing
90+
components (each remote owns its Svelte runtime — components compile
91+
per-remote, so likely fine — verify once with a real widget).
92+
- [ ] Sequence relative to [[No-Test-Coverage-TDD-Deferred-Despite-Agentic-Fit]]:
93+
extracting components without tests risks silent regressions across
94+
fourteen remotes; tests-then-extract or extract-with-tests-per-organ?
95+
- [ ] Relationship to the usability pass the v1 milestone named — the
96+
component inventory and the usability iteration probably want to be the
97+
same sweep.
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
---
2+
title: "No test coverage — TDD keeps getting deferred, despite being exactly the right fit for agentic development"
3+
lede: "Huge amounts of code get written, refactored, and rebuilt by agents with zero automated tests guarding key functionality. TDD is unusually well-suited to this codebase's working style — agents iterate until green, and tests are the durable spec of 'still works' across rewrites — but we've procrastinated it. Needs: pick the test environment for this stack, then climb incrementally to full coverage and full passing."
4+
date_created: 2026-07-24
5+
date_modified: 2026-07-24
6+
authors:
7+
- Michael Staton
8+
augmented_with:
9+
- Claude Code on Claude Fable 5
10+
semantic_version: 0.0.0.1
11+
tags:
12+
- Issue
13+
- Oversight
14+
- Augment-It
15+
- Testing
16+
- TDD
17+
- Agentic-Development
18+
status: Open · Jotted
19+
---
20+
21+
# No test coverage — the deferred TDD debt
22+
23+
## The admission
24+
25+
We have been procrastinating TDD for expediency. The current verification
26+
culture is real but ad-hoc: typechecks, builds, one-off NATS proof scripts
27+
(`scripts/prove-*.mjs`), and manual walk-throughs. What's missing is the
28+
regression floor — when an agent rewrites a service or refactors a remote,
29+
nothing automatically asserts that the key functionality still works.
30+
31+
## Why this matters MORE here, not less
32+
33+
Two properties of agentic development make tests unusually high-leverage:
34+
35+
1. **Volume and churn.** Agents write and rewrite at a rate where "a human
36+
remembers what this touched" stops being real. Tests are the only
37+
memory that runs.
38+
2. **The iterate-until-green loop.** Agents are natively good at "run
39+
tests, fix, repeat until passing" — a failing test suite is a better
40+
agent prompt than most prose. TDD converts agent effort from
41+
plausible-looking code into converging code.
42+
43+
The existing prove-scripts (Phase-1 acceptance style) are proto-tests —
44+
they already demonstrated the value (7/7 green as a standing regression
45+
across five phases). The gap is that they're bespoke, uncounted, and not
46+
run automatically.
47+
48+
## Scope of the decision (not yet made)
49+
50+
- **Test environment for this stack.** Candidates to evaluate against the
51+
real shape (Svelte 5 runes + rsbuild federation remotes; TS services
52+
over NATS; SurrealDB canonical layer):
53+
- **Vitest** — the default gravity for TS/Svelte unit + service tests.
54+
- **Svelte-component testing** — vitest + @testing-library/svelte, or
55+
accept svelte-check as the floor and test components thinly.
56+
- **Service/integration tier** — spin NATS (already in compose) and test
57+
handlers request/reply style; the prove-scripts show the pattern.
58+
- **Browser/E2E tier** — Playwright; overlaps deliberately with the
59+
browser-drive rung (anchor-root blueprint
60+
`Browser-Drive-Verification-For-Agent-Sessions.md`) — decide whether
61+
E2E specs and browser-drives are one artifact or two.
62+
- **Where tests live** — per-package `*.test.ts` with a turbo `test` task
63+
is the obvious shape; confirm.
64+
- **The canonical-layer problem** — service tests that touch SurrealDB
65+
need either a disposable local instance, a test namespace, or
66+
mocked-db seams. The no-test-entities-in-shared-canonical rule is
67+
already standing; tests must honor it structurally.
68+
69+
## The incremental path (sketch)
70+
71+
1. Choose the environment (one decision doc).
72+
2. Wire the harness + turbo task + CI job so `pnpm test` exists and is
73+
green-by-vacuous.
74+
3. Convert the existing prove-scripts into real tests (they're already
75+
assertions with known-good fixtures).
76+
4. New-code rule going forward: capabilities ship with tests (the loop doc
77+
`context-v/loops/Loop-through-Spec-Write-Plans-Implement-Test-Changelog-Commit.md`
78+
gains a rung).
79+
5. Backfill by subsystem, highest-churn first (resolver service, workspace
80+
capabilities router, social-search dispatch).
81+
82+
## Open questions
83+
84+
- [ ] One runner for everything vs. unit (vitest) + E2E (playwright) split?
85+
- [ ] CI: tests on every push to `rebuild/turbo-rsbuild`, or pre-push hook
86+
locally first while the suite is small?
87+
- [ ] Coverage target semantics — "full coverage" as literal % or as
88+
"every capability + every flow's happy path asserted"? (Leaning the
89+
latter; % chasing on UI code is low-yield.)
90+
- [ ] Relationship to [[Live-Not-Live-Indicator-Tooling-And-Cross-Service-Error-Surfacing]]
91+
tests guard pre-ship, liveness guards runtime; both needed.

0 commit comments

Comments
 (0)