Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions docs/debt/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ stay in place when retired; the log is the history).

| Entry | Status | Since | Area | Cost in one line |
| --- | --- | --- | --- | --- |
| [lps-probe-perf-test-load-sensitive](lps-probe-perf-test-load-sensitive.md) | carried | 2026-08-01 | lps-probe/tests | spurious full-gate reds whenever a dev server or sibling session runs; ~20% wall-clock headroom |
| [story-capture-pipeline](story-capture-pipeline.md) | carried | 2026-07-08 | studio-web/story-capture | ~15 min + flake retries per UI change; visual gates block under load |
| [web-serial-js-untestable](web-serial-js-untestable.md) | carried | 2026-07-10 | lpa-link/browser-serial | JS session/flash layer ships untested; bugs surface only on hardware |
| [library-format-migration-gap](library-format-migration-gap.md) | carried | 2026-07-08 | studio library/formats + share envelopes | breaking format changes silently invalidate durable authored data (library projects, pasted envelopes); failures surface as per-node parser errors — entry enumerates every surface and what it checks today |
Expand Down
48 changes: 48 additions & 0 deletions docs/debt/lps-probe-perf-test-load-sensitive.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
---
status: carried
since: 2026-08-01
logged: 2026-08-01
area: lps-probe/tests
related: ["story-capture-pipeline.md (same machine-load class)"]
---
# lps-probe wall-clock perf test fails under ambient machine load

**Shape** — `experiment::tests::perf_4096_render_evals_under_10s_debug`
asserts a 10 s wall-clock bound and runs in the default suite
(`test-rust-core`). Clean-machine runtime is ~8 s (debug), so the bound
carries only ~20% headroom — and the test has no isolation from ambient
load. This is structural because the documented review-gate workflow
*requires* competing load: `docs/process/review-gates.md` says the studio
dev server must be running at every visual-gate handoff, and a `dx` watch
build plus a second agent worktree reliably eats the margin. The perf
number exists to decide whether probe evaluation needs a worker offload —
a real question — but a hard assert in the default suite converts "the
machine was busy" into a red gate.

**Carrying cost** — `just test` / `just check test` fails spuriously
whenever a dev server or parallel agent session is active (three times on
2026-08-01 alone: 10.02 s, 18.01 s, 18.33 s vs the 10 s bound); each
failure costs a diagnose-and-rerun cycle, and the failure lands in an
unrelated PR's validation, casting doubt on good changes.

**Workarounds** — Stop the studio dev server (and pause heavy sibling
sessions) before running the full gate; rerun `cargo test -p lps-probe
--lib` in isolation to confirm (passes ~8 s clean). Do NOT widen the
bound to make churn stop without deciding what the number is for
(story-capture lore: thresholds widened under pressure stop measuring).
Also: capture full logs when backgrounding the gate — `… | tail`
reports tail's exit status and has masked this failure twice (same trap
already recorded in story-capture-pipeline.md).

**Incident log**
- 2026-08-01 — three consecutive full-gate failures during the M3
boards-catalog visual-gate session while the worktree dev server and a
second agent session were active; passed clean between them with the
server stopped. Filed this entry.

**Exit criteria** — The default suite contains no load-sensitive
wall-clock assert: the perf measurement either moves behind an opt-in
feature/recipe (perf job), switches to a load-insensitive proxy (eval
count / instruction budget), or gains enough isolation that a dev server
plus a sibling build cannot fail it. The measurement itself must survive
— it gates the P5 worker-offload decision.
6 changes: 6 additions & 0 deletions lp-app/lpa-boards/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,12 @@ serde = { workspace = true, features = ["derive"] }
serde_json = { workspace = true }
schemars = { workspace = true, optional = true }

[target.'cfg(target_arch = "wasm32")'.dependencies]
# Deep-link plumbing for the catalog's detail selection only (replaceState —
# fires no events). The components themselves stay DOM-free.
wasm-bindgen = "0.2"
web-sys = { version = "0.3", features = ["History", "Window"] }

[dev-dependencies]
lpc-hardware = { path = "../../lp-core/lpc-hardware" }

Expand Down
Loading
Loading