Deviation ledger for the substack-domain-surface plan (devague /deviate, run of 2026-09-13). Each entry is recorded in .devague/deliveries/substack-domain-surface.json and quoted here so the departure is visible outside the repo state.
d1 — t2 transport (classification: acceptable). The wave-5 dry run of substack post list returned HTTP 403. Substack rejects urllib's default Python-urllib/3.x User-Agent while a descriptive substack-cli/<version> (+repo) agent gets 200 (verified with curl on 2026-09-13). The transport now sends that header. The same fix narrowed the GET retry loop to 429, 5xx and transport errors; it previously retried every HTTPError, contradicting spec claim c38. Two tests (t6 post get, t8 reaction list) that asserted four attempts on a 404 now assert one. Commit 74fc94e.
d2 — t5 whoami (acceptable). account whoami reads user_id from GET /api/v1/subscription and then /publication for the publication block. The brief named /publication alone; the t12 capture showed only /subscription carries the signed-in user id (/user/self answers 403). Commit f9ffcd1.
d3 — t16 file scope (acceptable). t16 reworded the module docstring of substack_cli/substack/webglass.py, a file outside its brief, because the acceptance criterion is a literal grep for playwright over substack_cli/ and the docstring's "no playwright import" disclaimer tripped it. Meaning unchanged. Commit 6c37c06.
No task's acceptance criteria were weakened; the plan JSON is untouched. Spec follow-ups these imply: a requirement claim naming the User-Agent contract, and an amendment to c40's text naming /subscription.
Deviation ledger for the
substack-domain-surfaceplan (devague/deviate, run of 2026-09-13). Each entry is recorded in.devague/deliveries/substack-domain-surface.jsonand quoted here so the departure is visible outside the repo state.d1 — t2 transport (classification: acceptable). The wave-5 dry run of
substack post listreturned HTTP 403. Substack rejects urllib's defaultPython-urllib/3.xUser-Agent while a descriptivesubstack-cli/<version> (+repo)agent gets 200 (verified with curl on 2026-09-13). The transport now sends that header. The same fix narrowed the GET retry loop to 429, 5xx and transport errors; it previously retried every HTTPError, contradicting spec claim c38. Two tests (t6 post get, t8 reaction list) that asserted four attempts on a 404 now assert one. Commit 74fc94e.d2 — t5 whoami (acceptable).
account whoamireadsuser_idfromGET /api/v1/subscriptionand then/publicationfor the publication block. The brief named/publicationalone; the t12 capture showed only/subscriptioncarries the signed-in user id (/user/selfanswers 403). Commit f9ffcd1.d3 — t16 file scope (acceptable). t16 reworded the module docstring of
substack_cli/substack/webglass.py, a file outside its brief, because the acceptance criterion is a literal grep forplaywrightoversubstack_cli/and the docstring's "no playwright import" disclaimer tripped it. Meaning unchanged. Commit 6c37c06.No task's acceptance criteria were weakened; the plan JSON is untouched. Spec follow-ups these imply: a
requirementclaim naming the User-Agent contract, and an amendment to c40's text naming/subscription.