workflow-fix: correct upload-policy.md #1315 root-cause clause post-#1360
Highlight text on any card (body, plan, or an event) to anchor a comment, or leave a whole-task comment here. Mention @claude to summon a reply.
No comments yet.
Overview / Motivation
Auto-filed by the workflow-fix-on-bug protocol from a workflow-fix candidate raised on task #1360 (emitting agent: fact-checker prose, routed by the #1360 orchestrator; deferred until #1360's change landed on main per the "actively changing" deferral, now landed at merge 289ad17572925dfa3cdd3ff1f809be9159787aae).
Goal
Correct .claude/rules/upload-policy.md's rule-(c) layering paragraph (§ "HF Hub rate limit: 256 repository commits per hour"): the demonstrated #1315 no-path case was the un-retried api.file_exists verify fallback, not a classifier miss; and the paragraph's "for the Xet queue class it is the ONLY retry" claim is stale now that #1360 wrapped the fallback and added the "queue size reached" transient substring.
Workflow gap
- Bug observed: the paragraph asserts the #1315 no-path return came from "the response-less Xet 'maximum queue size reached' text, which
_is_transient_upload_errornever matches" — contradicted by the primary artifacts: #1315epm:failurev7 quotes429 Client Error: Too Many Requests(a matching substring, and response-bearing 429s classify by code), and the verified escape path was the barefile_existsverify probe (#1360 plan §3 diagnosis, three independent confirmations: fact-checker, methodology critic, #1345 crash-fix r5). The "ONLY retry" clause is additionally stale post-#1360. - Why it is a workflow gap: a rule file carrying a wrong root-cause account + a stale only-retry claim misleads the next dispatcher author sizing seam retries (they would over-build outer retries believing hub cannot cover the queue class).
- Confidence (emitter): high
- verified-at-filing:
grep -n "maximum queue size reached" .claude/rules/upload-policy.md→ 2 hits in 1 file (L244 = the accurate #1335 record, keep; L283 = the offending clause in the rule-(c) paragraph, target) (2026-07-15)
Proposed change (candidate diff sketch — refine in planning)
- so a no-path return means the inner budget
- EXHAUSTED or the failure classed non-transient: the demonstrated #1315 case is
- the response-less Xet "maximum queue size reached" text, which
_is_transient_upload_errornever matches (quota-403 and the 0-files-verify- path land here too). The seam retry is the cheap OUTER envelope — each attempt
- re-enters the full inner envelope after a 30-120 s pause; for the Xet queue
- class it is the ONLY retry.
- so a no-path return means the inner budget
- EXHAUSTED or the failure classed non-transient (quota-403 and the
- 0-files-verify path land here). The demonstrated #1315 case was the then
- un-retried
api.file_existsverify fallback insidelist_hf_files_under_path - — fixed fleet-wide by #1360 (merge 289ad17572): the fallback now rides
_retry_upload, and "queue size reached" classifies transient response-less.- The seam retry remains a cheap bounded OUTER envelope (each attempt re-enters
- the full inner envelope after a 30-120 s pause), no longer the only retry for
- the Xet queue class.
Scope / surfaces
- Primary target:
.claude/rules/upload-policy.md - Grep the workflow surface for the pattern before editing
(
grep -rln 'maximum queue size reached' .claude/ CLAUDE.md scripts/) and update every hit whose claim is wrong (L283 paragraph); L244 (#1335 record) is accurate history — keep.
Constraints / invariants
- Workflow-surface only — never experiment code,
configs/, ortasks/. scripts/workflow_lint.py --check-askspasses; ruff on touched files passes.- This session runs under
EPM_WORKFLOW_FIX_SESSION=1and carries aworkflow_fix_target:Provenance line — it MUST NOT auto-route any of its own subagents' workflow-fix candidates (recursion guard).
Provenance
- workflow_fix_target: .claude/rules/upload-policy.md
- fingerprint: 2d03790dc914
Surfaced prose (fact-checker, task #1360, 2026-07-15): ".claude/rules/upload-policy.md was concurrently updated with a paragraph claiming the #1315 no-path return was 'the response-less Xet maximum queue size reached text, which _is_transient_upload_error never matches' — that account is contradicted by the v7 marker text (which contains 'Too Many Requests', a matching substring) and by the code reading; the plan's §3 diagnosis (unwrapped call site) is the one the primary artifacts support."