remediation agent froze applying fixes to legacy table layout
Fixes remediation agent freezes on legacy tables by bounding the patch to headers and scope. Use it when the agent stalls planning a rewrite. Not for simple tables, which need no scoping.
remediation agent froze applying fixes to legacy table layout - how to fix it
TL;DR
Bound the table rewrite: legacy table layouts need a scoped strategy (fix headers and scope first, then stop), not a full modernization. Agents that try to convert a 400-row table layout to CSS grid freeze in the planning. One line of why: the audit asks for accessible tables, not a redesign, and the agent must know where the fix ends.
The error, verbatim
RemediationAgentError: no progress for 600s on legacy table
table: 400 rows, nested tables, spacer gifs
plan: full conversion to semantic grid (never started)
Fix it step by step
Step 1: Reproduce the freeze
node agent/remediate.js --rule table | rg -i 'no progress|planning' | head -5Expected: The agent plans a rewrite and never acts.
Step 2: Scope the fix
npx @axe-core/cli https://example.com/legacy --rules table-headers,scope-attr-valid,td-headers-attr | tail -3Expected: The actual violations are headers and scope, not the layout choice.
Step 3: Bound the patch
rg -n 'table|scope' agent/patches/table.js | head -10Expected: Restrict the patch to th/scope/headers fixes; flag modernization as a separate project.
Step 4: Re-run remediation
node agent/remediate.js --rule table | tail -4Expected: Agent fixes headers and scope, reports the layout as tech debt, and moves on.
Step 5: Add a regression probe
node agent/run-audit.js --smoke | tail -3Expected: Smoke run passes; schedule it so the breakdown is caught if it ever regresses.
When to use this skill
- You run an agent that scans UIs for accessibility and it hits this breakdown
- The agent's scan loop stalls, crashes, or loops on this exact failure
- You are hardening an audit agent's error handling for production scans
When NOT to use this skill
- A human runs the scan manually and it works, this is agent-harness failure handling
- The scan completes and only reports violations, use the rule-specific skills
Compatibility
Remediation agent with table patch primitives. The scope boundary is a team decision encoded in the patch policy. Pin the tool version in the lockfile so scans stay reproducible across machines.
Variant phrasings
agent frozen on table layout
Same freeze, same scoping.
legacy table remediation stall
Practitioner phrasing.
the breakdown hits other routes too
Agent failure modes are systemic; apply the hardening to every route the agent covers, not just the one that failed.
Why it happens
Legacy table layouts (nested tables, spacer images, presentation markup) trigger agents to plan full modernizations, which is a redesign disguised as a fix. The planning never converges because the scope is unbounded. The accessibility fix is bounded: proper th headers, scope attributes, captions where missing. The modernization is a separate project with design input. Agents need an explicit patch boundary for legacy code: fix the violations, flag the debt, move on. Agent breakdowns are systemic: the same failure mode will hit every route, page, or run the agent touches. Harden the harness once (timeouts, loop detection, verification gates) instead of patching per page, and keep breakdown telemetry separate from violation counts.
Edge cases
- Layout tables should get role presentation, data tables get headers, the agent must distinguish them first.
- Spacer gifs get empty alt as part of the bounded fix, that is cheap and safe.
- Never let the agent restructure a 400-row table unsupervised, the regression risk dwarfs the a11y gain.
- Log breakdowns separately from violations in agent telemetry; mixing them hides whether the agent itself is getting more reliable.
Provenance
Resolved from the public thread: https://vectle.com/posts/pst_9zPHhigjkKiaaoL2hvpCAw