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
Handoff: continue Plumb real-project dogfood and noise reduction after PRs #309-#313
Context
This issue is the stopping-point handoff for the ongoing goal:
Iterate Plumb toward: hand an AI agent a short, correct, actionable list of rendered design-system violations it can fix in a loop.
Plumb is a deterministic design-system linter for rendered websites:
CLI: plumb lint <url>
MCP server: plumb mcp
Core source of truth: docs/local/prd.md
Project rules: AGENTS.md and .agents/rules/*.md
Read first:
docs/local/handoff_to_codex.md
docs/local/prd.md
AGENTS.md
.agents/rules/*.md
Current main at handoff:
SHA: 8c2a3bf02aa684e11784b6a187818bd5f2099935
Local Plumb worktree was clean at handoff.
Dogfood ports used during the session (3210, 3220, 3230) were stopped before handoff.
docs/local/*.md logs are gitignored local evidence on this machine. This issue repeats the important context so the next agent is not blocked if local scratch docs are unavailable.
Estimated plan completion: about 60-65%. The core CDP/MCP stability and first real init --from fixes are merged. The remaining work is mostly more real-project dogfood coverage, config inference gaps, spacing/touch-target noise, and release follow-through.
failed to parse CSS file
`/Users/aramhammoudeh/dev/vertice-labs/treasure/packages/ui/storybook-static/assets/preview-DSFCuGKh.css`:
unterminated string
Classification:
High-value Plumb bug. The walker treats generated Storybook static CSS as a fatal token-source parse error.
Likely first next PR: skip storybook-static in the codegen walker, or make generated CSS parse failures non-fatal with deterministic warnings. The smaller safer fix is probably adding storybook-static to crates/plumb-codegen/src/walk.rsSKIPPED_DIRS with a test.
App-root init --from:
apps/web-pos and apps/web-vendor succeed, but emit a comment-only config with just tailwind.config.ts.
Gap: actual design tokens live in shared CSS imported from workspace packages such as @treasure/ui/theme/globals.css and tooling/tailwind/theme.css. The app-root walker does not follow workspace package CSS token imports.
lint_url with plumb-fake://hello returned compact structured content:
total: 1
spacing/grid-conformance: 1
lint_page_html with embedded CSS rendered through Chromium and returned:
total: 6
color/contrast-aa: 1
spacing/grid-conformance: 5
Classification:
lint_url fake finding: expected smoke result.
lint_page_html authored margin-left: 3px, padding-top: 5px, and borderline contrast were true positives.
Extra button UA default padding findings (6px, 1px) were noise for snippet use. Consider docs/examples that include reset CSS, or a carefully designed snippet-mode reset. Be careful: lint_page_html promises real computed styles, so silently changing UA styles could hide defects.
For each target: build or serve, run plumb init --from, run CLI lint, run MCP tools (lint_url / lint_page_html), classify every finding as true positive / false positive / noise / miss.
Handoff: continue Plumb real-project dogfood and noise reduction after PRs #309-#313
Context
This issue is the stopping-point handoff for the ongoing goal:
Plumb is a deterministic design-system linter for rendered websites:
plumb lint <url>plumb mcpdocs/local/prd.mdAGENTS.mdand.agents/rules/*.mdRead first:
docs/local/handoff_to_codex.mddocs/local/prd.mdAGENTS.md.agents/rules/*.mdCurrent
mainat handoff:8c2a3bf02aa684e11784b6a187818bd5f20999353210,3220,3230) were stopped before handoff.docs/local/*.mdlogs are gitignored local evidence on this machine. This issue repeats the important context so the next agent is not blocked if local scratch docs are unavailable.Estimated plan completion: about 60-65%. The core CDP/MCP stability and first real
init --fromfixes are merged. The remaining work is mostly more real-project dogfood coverage, config inference gaps, spacing/touch-target noise, and release follow-through.Merged during this workstream
All code changes were merged via PRs into
main.fix(cdp,mcp): stabilize page linting noise #309
fix(cdp,mcp): stabilize page linting noise627c4ec2689a9195114903e93d200cd9695c99c9fix(cdp): keep default raw readiness best effort #310
fix(cdp): keep default raw readiness best effort8c952d5de87734fa80ed686a08aa812bfe02ffa4feat(codegen): infer workspace token modules #311
feat(codegen): infer workspace token modulesab126c975e860ae240c3ef84a3b9b875a5938de9plumb init --from apps/webnow discovers workspace token modules under conventionalpackages/*/src/tokens/**/*.{ts,tsx,js,jsx}.fix(codegen): prefer light token exports #312
fix(codegen): prefer light token exports8be27ec8011ca4f46aeeab608ff589ab046321fedarkexports sorted beforelight, so duplicate keys generated dark defaults.plumb init --from apps/webnow emits light/default values first, e.g. IMRbackground = "#faf7f7",foreground = "#3f5965",primary = "#007068".fix(codegen): parse rem token lengths #313
fix(codegen): parse rem token lengths8c2a3bf02aa684e11784b6a187818bd5f2099935remandemstring lengths in literal token modules using the same 16px convention as the Tailwind adapter.radius.base = "0.75rem"now produces[radius] scale = [12].Validation used before the codegen PRs:
Scoreboard baseline after #312/#313:
Dogfood evidence
IMR agent
Project:
/Users/aramhammoudeh/dev/vertice-labs/imr/imr-agentapps/webpnpm --filter @repo/web buildPORT=3210 pnpm --filter @repo/web startplumb init --from /Users/aramhammoudeh/dev/vertice-labs/imr/imr-agent/apps/webplumb lint http://127.0.0.1:3210/app --format jsonResults:
init --from apps/webnow finds the workspace token modules./appwith default and generated config both returned 8 warnings:a11y/touch-target: 1spacing/grid-conformance: 7Finding classification:
a11y/touch-targeton a small inline forgot-password style link: likely false positive/noise. WCAG 2.5.8 has an inline target exception.-1px/-2pxspacing findings: noise/layout artifacts.mb-1.5/py-1.5.Remaining IMR gaps:
calc(var(--radius) - 2px)andcalc(var(--radius) - 4px)derived radius aliases are still not inferred.typography.tsusesvar(--font-geist-sans), so the type family is not inferred.Treasure
Project:
/Users/aramhammoudeh/dev/vertice-labs/treasureapps/web-posandapps/web-vendor.Build:
pnpm install --frozen-lockfile --ignore-scriptsrepaired deps.packages/api/modules/accounts/active-vendor.ts:101:37Parameter 'sv' implicitly has an 'any' type.Important
init --fromblocker:Failed with:
Classification:
storybook-staticin the codegen walker, or make generated CSS parse failures non-fatal with deterministic warnings. The smaller safer fix is probably addingstorybook-statictocrates/plumb-codegen/src/walk.rsSKIPPED_DIRSwith a test.App-root
init --from:apps/web-posandapps/web-vendorsucceed, but emit a comment-only config with justtailwind.config.ts.@treasure/ui/theme/globals.cssandtooling/tailwind/theme.css. The app-root walker does not follow workspace package CSS token imports.MCP dogfood
Used a real stdio JSON-RPC client against:
PLUMB_CHROME="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \ /Users/aramhammoudeh/dev/plumb/target/debug/plumb mcpRequests:
initializenotifications/initializedtools/listtools/callwithlint_urltools/callwithlint_page_htmlResults:
tools/listexposed:compare_viewportsechoexplain_ruleget_configlint_page_htmllint_urllist_ruleslint_urlwithplumb-fake://helloreturned compact structured content:spacing/grid-conformance: 1lint_page_htmlwith embedded CSS rendered through Chromium and returned:color/contrast-aa: 1spacing/grid-conformance: 5Classification:
lint_urlfake finding: expected smoke result.lint_page_htmlauthoredmargin-left: 3px,padding-top: 5px, and borderline contrast were true positives.buttonUA default padding findings (6px,1px) were noise for snippet use. Consider docs/examples that include reset CSS, or a carefully designed snippet-mode reset. Be careful:lint_page_htmlpromises real computed styles, so silently changing UA styles could hide defects.Pickleball Ventures
Project:
/Users/aramhammoudeh/dev/vertice-labs/pickleball-venturesapps/marketing/.State:
plumb.tomlartifact was removed before handoff.Highest-impact remaining work
Work in small PRs, with golden/unit tests first where appropriate, and merge each PR after CI.
Fix Treasure root
init --fromblocker.crates/plumb-codegen/src/walk.rs.storybook-staticto skipped generated dirs, or implement deterministic non-fatal CSS parse handling.storybook-static/assets/*.cssparse trap is skipped and does not abort inference.cd /tmp /Users/aramhammoudeh/dev/plumb/target/debug/plumb init \ --from /Users/aramhammoudeh/dev/vertice-labs/treasure --forceImprove app-root config usefulness for Tailwind v4 workspace CSS tokens.
Reduce spacing/touch-target noise from real pages.
a11y/touch-targetwhen they meet the WCAG inline exception.1.5-> 6px) should be understood via generated config or rule tolerance, not reported as noisy off-grid findings.Continue dogfood coverage.
/Users/aramhammoudeh/dev/vertice-labs/homesite/Users/aramhammoudeh/dev/solace-candidate-assignment-main~/dev/*web apps available.plumb init --from, run CLI lint, run MCP tools (lint_url/lint_page_html), classify every finding as true positive / false positive / noise / miss.Release follow-through.
chore(main): release 0.0.14) is still open.release.yml+pages.ymlwhen you want a 0.0.14 cut containing the docs/brand and follow-up fixes.Re-publish plumb-cli@0.0.13 to npm) is still open and requires user npm token rotation. Do not try to solve it without the rotated token.Required gates before each PR
Follow the handoff discipline:
Use narrower tests while developing, but do not skip the full gate before PR.
Chrome path:
If Chromium hits a SingletonLock error:
rm -rf "$TMPDIR/chromiumoxide-runner"Process expectations for the next agent
mainat or after8c2a3bf02aa684e11784b6a187818bd5f2099935.codex/...branches.docs/local/dogfood-<project>.mdlogs locally for every real project.plumb-coredeterministic and layer-clean.Definition of done for this issue
This handoff issue is not the finish line for the product goal. It is done when the next agent has:
init --fromblocker.