generated from mathias/template-go-web
feat(stuck): stuck-state pipeline overlay (cad-atlas#11)
Consumes mathias/cad#14's cad-stuck query directly — cad's app/domain packages are public Go modules, so this reuses the exact tested classification logic (import, not re-implementation) rather than duplicating the taxonomy across two repos. ApplyStuckOverlay (internal/atlas/stuck.go, fixture-tested) maps each finding's category onto the existing 9-stage pipeline: armed_never_fired to the human dispatch gate, claimed_never_ran/ceiling_hit/refire_loop/ near_attempt_cap to the one Execute stage (there is no separate Claim stage), done_not_closed to the loop-back stage. Adds a StuckCount/ AwaitingCount badge per stage plus one Node per finding, linking out to the underlying issue/comment — read-only, no controls, matching cad#14's own constraint. Two visual classes, kept deliberately distinct per the issue's own framing: a coral 'N stuck' badge (needs intervention) vs a green 'N awaiting' badge (a functioning control waiting on a human) — done_not_closed can never render as a bottleneck. Verified against the live estate: STAGE 05 shows 2 stuck (cobalt-dingo#30 ceiling_hit, cad-atlas#10 near_attempt_cap), STAGE 08 shows 5 awaiting (cobalt-dingo #3/#7/#12/#16/#19 done_not_closed) — screenshotted via a koala k3s Playwright job against a live-token server, matching cad#14's own proven query output exactly. go.mod: added git.d-ma.be/mathias/cad v0.10.0 (app/domain/adapters-gitearead only — no mcp-chassis pulled in, that's only imported by cad's own cmd/cad). Dockerfile: added the same GOPRIVATE/insteadOf fetch config mathias/cad's own Dockerfile uses, now needed for this new private-module dependency. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -120,6 +120,17 @@
|
||||
border:1px solid var(--line);color:var(--dim);margin:6px 6px 0 0}
|
||||
.pill{width:8px;height:8px;border-radius:50%;flex:0 0 8px}
|
||||
|
||||
/* cad-atlas#11: stuck-state overlay. Two visual classes, deliberately
|
||||
distinct — "stuck" needs intervention, "awaiting-human" is a control
|
||||
working as designed and must never look like a problem. */
|
||||
.node.stuck{border-color:rgba(255,122,92,.55);background:linear-gradient(180deg,rgba(255,122,92,.07),transparent)}
|
||||
.node.awaiting-human{border-color:rgba(74,208,122,.5);background:linear-gradient(180deg,rgba(74,208,122,.06),transparent)}
|
||||
.stagehead{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}
|
||||
.stagehead .badges{display:flex;gap:6px}
|
||||
.badge{font-size:10.5px;padding:2px 8px;border-radius:20px;font-weight:600;white-space:nowrap}
|
||||
.badge.stuck{color:var(--coral);border:1px solid rgba(255,122,92,.5)}
|
||||
.badge.awaiting{color:var(--green);border:1px solid rgba(74,208,122,.5)}
|
||||
|
||||
.stage.telos h2{color:var(--violet)}
|
||||
.stage.gate h2{color:var(--amber)}
|
||||
.stage.exec h2{color:var(--coral)}
|
||||
@@ -234,7 +245,16 @@ function renderAtlas(){
|
||||
? `<div class="no mono">${s.no}</div><h2>${s.plain_title||s.title}</h2>`+
|
||||
`<div class="tech-sub">${s.title}</div>`+(s.plain?`<div class="plain-what">${s.plain}</div>`:'')
|
||||
: `<div class="no mono">${s.no}</div><h2>${s.title}</h2><div class="path mono">${s.path||''}</div>`;
|
||||
let h = `<div class="stagehead">${head}</div>`;
|
||||
// cad-atlas#11: a count badge per stage from cad-stuck (mathias/cad#14),
|
||||
// read-only — no controls, just a count and (via the nodes below) a link
|
||||
// out to the underlying issues. Two classes, kept visually separate: a
|
||||
// "stuck" count needs intervention, an "awaiting" count is a control
|
||||
// working as designed and must never read as a problem.
|
||||
let badges='';
|
||||
if(s.stuck_count)badges+=`<span class="badge stuck">${s.stuck_count} stuck</span>`;
|
||||
if(s.awaiting_count)badges+=`<span class="badge awaiting">${s.awaiting_count} awaiting</span>`;
|
||||
if(badges)badges=`<span class="badges">${badges}</span>`;
|
||||
let h = `<div class="stagehead">${head}${badges}</div>`;
|
||||
(s.nodes||[]).forEach(n=>{
|
||||
const pill=n.pill?`<span class="pill" style="background:${n.pill}"></span>`:'';
|
||||
const body = plain ? (n.plain||n.d||'') : (n.d||'');
|
||||
|
||||
Reference in New Issue
Block a user