Skip to content

spike: CritterWatch telemetry fodder + JasperFx UI/UX feedback packet#103

Draft
erikshafer wants to merge 4 commits into
mainfrom
research/cw-telemetry-spike
Draft

spike: CritterWatch telemetry fodder + JasperFx UI/UX feedback packet#103
erikshafer wants to merge 4 commits into
mainfrom
research/cw-telemetry-spike

Conversation

@erikshafer

Copy link
Copy Markdown
Owner

What this is

A research spike that lights up the CritterWatch monitoring console so a UI/UX review of the Event Store Explorer rests on a fully populated console, then distills that into actionable feedback for JasperFx (Jeremy & Babu), who are seeking larger real-world projects to evaluate CW.

Warning

Not intended to merge to main. This deliberately relaxes ADR 008 (no async daemon, round one) on this branch only, all behind a single Cw:Telemetry flag so the teaching baseline stays daemon-free. The PR exists to review and durably house the spike + the feedback artifact. Any graduation of a shape to the baseline is a deliberate ADR-008 revisit on its own PR, not a merge of this spike. Keep open as a research record, or close without merging once the feedback is delivered.

Telemetry shapes (Orders, gated on Cw__Telemetry; daemon runs only when set)

  • ProductSalesLeaderboard — multi-stream fan-out projection (Identities), one OrderPlaced to one doc per SKU.
  • OrderLineItemsProjectionEventProjection writing a flat SQL table (orders.order_line_items) with event metadata the FlatTableProjection DSL can't reach.
  • PoisonPing + POST /spike/poison — a handler that always throws, to populate Dead Letters and the Projection-Statuses Error column.
  • OrderPlacedSignal — a Contracts broadcast fanned out to Inventory + Catalog (gives Catalog its first cross-BC edge).

Traffic + evidence

  • docs/demo-traffic.ps1 gains opt-in -LinesPerOrder / -MaxQuantity (multi-line, multi-unit orders feeding the fan-out + flat table) and -PoisonEvery (Dead Letters). Defaults preserve the talk's single-line, decline-every-5th flow.
  • docs/research/cw-screenshots/capture-cw.cjs (Playwright tour) + 27 full-page captures of every console surface, including the driven StockLevel stepper failure.

The deliverable

  • docs/research/cw-feedback-jasperfx.md — 8 prioritized, screenshot-anchored UI/UX entries with a "five things in beta" shortlist.
  • docs/research/cw-telemetry-fodder.md — the spike's plan, live-verification results, and the feedback seeds.

Verification

Built clean (0/0); live-verified against a running stack (daemon caught up, fan-out docs correct, flat table populating, dead letters, broadcast topology). Screenshots regenerated by the committed capture script. Details in cw-telemetry-fodder.md.

🤖 Generated with Claude Code

Research spike (branch research/cw-telemetry-spike) to light up the CritterWatch
monitoring console so a UI/UX review of the Event Store Explorer rests on a fully
populated console, then distill that into actionable feedback for JasperFx
(Jeremy/Babu), who are seeking larger real-world projects to evaluate CW.

NOT FOR main. This deliberately relaxes ADR 008 (no async daemon, round one) on
this branch only, all behind a single Cw:Telemetry flag so the teaching baseline
stays daemon-free. Any graduation of a shape to the baseline is a deliberate
ADR-008 revisit on its own PR, not a quiet merge of this spike.

Telemetry shapes (Orders, gated on Cw__Telemetry, daemon on only when set):
- ProductSalesLeaderboard: multi-stream fan-out projection (Identities), one
  OrderPlaced -> one doc per SKU.
- OrderLineItemsProjection: EventProjection writing a flat SQL table
  (orders.order_line_items) with event metadata the FlatTableProjection DSL can't reach.
- PoisonPing + POST /spike/poison: a handler that always throws, to populate
  Dead Letters and the Projection-Statuses Error column.
- OrderPlacedSignal: a Contracts broadcast fanned out to Inventory + Catalog
  (gives Catalog its first cross-BC edge).

Traffic + evidence:
- docs/demo-traffic.ps1 gains opt-in -LinesPerOrder / -MaxQuantity (multi-line,
  multi-unit orders feeding the fan-out + flat table) and -PoisonEvery (Dead
  Letters). Defaults preserve the talk's single-line, decline-every-5th flow.
- docs/research/cw-screenshots/: capture-cw.cjs (Playwright tour) + 27 full-page
  captures of every console surface, incl. the driven StockLevel stepper failure.

Docs:
- docs/research/cw-feedback-jasperfx.md: 8 prioritized, screenshot-anchored UI/UX
  entries with a beta shortlist.
- docs/research/cw-telemetry-fodder.md: the spike's plan, live-verification, and seeds.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@erikshafer

Copy link
Copy Markdown
Owner Author

Session handoff (2026-06-24)

Where this landed and what's left, for a fresh read.

Done

  • Spike committed (a91d865) and pushed; this PR opened.
  • Telemetry shapes (fan-out leaderboard, flat-table EventProjection, poison path, OrderPlacedSignal broadcast), all gated behind Cw:Telemetry. Built clean, live-verified.
  • demo-traffic.ps1 extended with opt-in -LinesPerOrder / -MaxQuantity / -PoisonEvery; defaults unchanged.
  • 27 screenshots + reusable capture-cw.cjs under docs/research/cw-screenshots/.
  • Feedback packet docs/research/cw-feedback-jasperfx.md: 8 prioritized, screenshot-anchored UI/UX entries + a "five things in beta" shortlist. Prose cleaned (no em-dashes).
  • Local demo stack torn down.

Your call (morning)

  • Re-read the feedback doc and the cover message (the cover message lives only in the chat thread, copy it out before it ages off).
  • Decide: send to Jeremy & Babu as-is, or refine first.

Parked, all optional

  • Capture the "before" baseline set (Cw__Telemetry=false, re-run capture-cw.cjs) for a before/after pair.
  • Dash-cleanup pass over the two companion docs for whole-set consistency.
  • Competing-consumers -> per-service fan-out refinement (~10 lines) if a true dual-edge topology is wanted.

Important

This PR is a do-not-merge research record. Merging would breach ADR 008 (no async daemon, round one). Keep it open as the durable home, or close without merging once the feedback is delivered. Any graduation of a shape into the teaching baseline is a separate, deliberate ADR-008 revisit.

🤖 Generated with Claude Code

@erikshafer erikshafer self-assigned this Jun 25, 2026
@erikshafer erikshafer marked this pull request as draft June 25, 2026 05:33
@erikshafer erikshafer added the wontfix This will not be worked on label Jun 25, 2026
erikshafer and others added 3 commits June 25, 2026 10:31
Add a "How to read the suggestions" note framing every recommendation as
a question, not a verdict, and stating the embrace-the-vocabulary
principle outright. Reframe entry 7 from "where the vocabulary leaks" to
"teach the Critter Stack vocabulary in place" — exposing the terms is a
feature; the ask is in-place ⓘ definitions, not hiding or renaming. Sync
the top-five summary to match.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…essment

Second, deeper CritterWatch feedback pass on the cw-telemetry-spike branch,
adding a Developer-Experience lens and interaction-level UI/UX analysis on
top of round one's static UI/UX review. Runs on the installed alpha.3 (GA
Wolverine 6.12.0); alpha.4 is assessed as a written recommendation only
(deferred to a separate upgrade branch -- prerelease Wolverine/Marten risk).

Deliverable: docs/research/cw-feedback-jasperfx-deep.md
- DX section: version-coupling preflight, licensing dev-tier mask, install
  docs' DLQ-disable contradiction, doc-vs-binary drift, immutable-record
  stepper crash (re-confirmed live 107x), unwired MCP surface.
- Deeper UI/UX: axe-core WCAG pass (79 hits concentrated in the shared
  shell), red-chip contrast, no responsive reflow, no dark mode, no
  deep-linking, interactive two-selector-conflict repro.
- Round-one closure: all 8 entries re-checked; nothing regressed.

Tooling: docs/research/cw-screenshots/capture-cw-deep.cjs -- Playwright +
axe-core harness (interaction, a11y, narrow-viewport, dark-mode, deep-link
probes). Round-one capture-cw.cjs left intact. Evidence + machine-readable
reports under cw-screenshots/deep/.

Live-verified against the running stack (async daemon caught up, fan-out +
flat table + DLQ populated, license validates as Trial, console boots with
no TypeLoadException). No package changes; no secrets committed.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…ine (deep round follow-ups)

Two follow-ups to the deep CritterWatch feedback round, on the cw-telemetry-spike
branch (research record, do-not-merge).

CritterWatch.Mcp (DX-6, now wired & exercised, not docs-only):
- Pin CritterWatch.Mcp 1.0.0-alpha.3 (locked to the CritterWatch pin); reference it
  from the console; AddCritterWatchMcp() + MapCritterWatchMcp() in the console host.
- Drove /api/mcp live: mounts clean (405 to GET, JSON-RPC initialize stateless,
  tools/list = 37 tools), schemas are exemplary. BUT every tool returns LicenseMissing
  even though the same process's dashboard validates the key as Trial -- the MCP
  license guard resolves the license by a different path than the console. Evidence:
  cw-screenshots/deep/mcp-probe-output.txt. DX-6 rewritten from "unwired gap" to this.

Baseline "before" set:
- Captured the 13 routes with Cw__Telemetry=false (inline-only, no async daemon) into
  cw-screenshots/deep/baseline/ to pair against the lit "after" set -- the contrast
  round one never captured. AppHost telemetry flag flip was transient (reverted).

No round-one product behavior changed; the MCP wiring is a spike-only DX exploration.
No secrets committed.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

wontfix This will not be worked on

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant