Skip to content

Commit ded59ce

Browse files
committed
docs(workflows): five 65536 restatements re-worded to the measured caps, each naming its record
The five lines asserted "GitHub's 65536-character limit" as fact. The ISSUE-body half was falsified by bisection (objectstack#18793: 262,144 UTF-8 bytes stored, 262,145 refused); the COMMENT half is bisected here (objectstack#18826: the same boundary, on both createComment and updateComment, with a real 422 where the issue-body surface is silent). A github-script step cannot import ISSUE_BODY_LIMIT, so these five are restatements by construction — so each now NAMES the record it was read from, and the next falsification finds all five by grep. GitHub's own 422 text still claims "maximum is 65536 characters" and is false in both unit and value; every restatement says so, because that string is where the folklore comes back from. test-nightly-tiers.yml's BUDGET = 40000 is left at 40,000 and stated as what it is: a reading budget sized against the reader, not a platform bound inherited from the false cap. No behaviour changes: comments only. retry-exempt-status-codes is untouched on all four files that carry it. Claude-Session: https://claude.ai/code/session_01Gqi43smmqjJ5sUrhfoPeKu Co-authored-by: Claude <noreply@anthropic.com>
1 parent ad1f94e commit ded59ce

5 files changed

Lines changed: 81 additions & 15 deletions

File tree

‎.github/workflows/cross-repo-issue-closer.yml‎

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -162,10 +162,21 @@ jobs:
162162
# to fail instead of one. It still fails, and the loop still names the
163163
# target it failed on.
164164
#
165-
# 400/401/404/422 stay exempt: a malformed request, a wrong target, or a
166-
# body past GitHub's 65536-character comment limit is this repo's own
167-
# bug. It is answered correctly on the first try and asking again only
168-
# spends runner minutes.
165+
# 400/401/404/422 stay exempt: a malformed request, a wrong target, or
166+
# an oversized body is this repo's own bug. It is answered correctly on
167+
# the first try and asking again only spends runner minutes.
168+
#
169+
# Both caps this step can hit are MEASURED, in UTF-8 BYTES, and they are
170+
# the same number — ⛔ neither is the 65,536 characters this comment used
171+
# to name. A COMMENT (`issues.createComment` below) stores 262,144 bytes
172+
# and refuses 262,145 with a real 422: objectstack#18826, bisected to one
173+
# byte. An ISSUE BODY (`issues.update` below) stores 262,144 and refuses
174+
# 262,145 SILENTLY — 200, old body kept, nothing reported:
175+
# objectstack#18793, bisected to one byte, restated as
176+
# `ISSUE_BODY_LIMIT` in scripts/pm/check-half-states.mjs. ⛔ Do not
177+
# re-derive 65,536 from a refusal message: GitHub's own 422 text still
178+
# says "maximum is 65536 characters" and #18826 falsified it in both unit
179+
# and value by storing a 262,144-character comment.
169180
retries: 3
170181
retry-exempt-status-codes: 400,401,404,422
171182
script: |

‎.github/workflows/docs-drift-check.yml‎

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -554,9 +554,17 @@ jobs:
554554
// separates it from a genuine permission denial.
555555
// Everything else stays fatal on purpose: 401 / plain 403 (the `permissions:`
556556
// block above is wrong), 404 (wrong target), 422 (the body this workflow built
557-
// is not postable — e.g. past GitHub's 65536-character comment limit), and any
558-
// non-HTTP error such as a TypeError in the code above. Those are this repo's
559-
// own bugs and must keep failing the job.
557+
// is not postable — e.g. past the COMMENT cap), and any non-HTTP error such as
558+
// a TypeError in the code above. Those are this repo's own bugs and must keep
559+
// failing the job.
560+
//
561+
// That cap is MEASURED, in UTF-8 BYTES, ⛔ not the 65,536 characters this
562+
// comment used to name: a comment stores 262,144 bytes and refuses 262,145
563+
// with a real 422, on BOTH `issues.createComment` and `issues.updateComment`
564+
// below — objectstack#18826, bisected to one byte on each endpoint. ⛔ Do not
565+
// re-derive 65,536 from the refusal itself: GitHub's own 422 text still reads
566+
// "maximum is 65536 characters" and #18826 falsified it in both unit and
567+
// value, storing a 262,144-CHARACTER comment.
560568
const TRANSIENT_NETWORK_CODES = new Set([
561569
'ECONNRESET', 'ECONNREFUSED', 'ETIMEDOUT', 'EAI_AGAIN', 'ENOTFOUND', 'EPIPE',
562570
'EHOSTUNREACH', 'ENETUNREACH', 'UND_ERR_SOCKET', 'UND_ERR_CONNECT_TIMEOUT',

‎.github/workflows/merge-queue-triage.yml‎

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -174,9 +174,22 @@ jobs:
174174
# wrong `permissions:` block) now takes four attempts to fail instead of
175175
# one. It still fails.
176176
#
177-
# 400/401/404/422 stay exempt: a malformed request, a wrong target, or a
178-
# body past GitHub's 65536-character comment limit is this repo's own bug,
179-
# answered on the first try and not improved by asking again.
177+
# 400/401/404/422 stay exempt: a malformed request, a wrong target, or
178+
# an oversized body is this repo's own bug, answered on the first try and
179+
# not improved by asking again.
180+
#
181+
# Both caps this workflow can hit are MEASURED, in UTF-8 BYTES, and they
182+
# are the same number — ⛔ neither is the 65,536 characters this comment
183+
# used to name. A COMMENT (`issues.createComment` below) stores 262,144
184+
# bytes and refuses 262,145 with a real 422: objectstack#18826, bisected
185+
# to one byte. An ISSUE BODY (`issues.update` / `issues.create` below)
186+
# stores 262,144 and refuses 262,145 — on `create` with a 422 (#18826),
187+
# on `update` SILENTLY, 200 with the old body kept and nothing reported:
188+
# objectstack#18793, bisected to one byte, restated as
189+
# `ISSUE_BODY_LIMIT` in scripts/pm/check-half-states.mjs. ⛔ Do not
190+
# re-derive 65,536 from a refusal message: GitHub's own 422 text still
191+
# says "maximum is 65536 characters" and #18826 falsified it in both unit
192+
# and value by storing a 262,144-character comment.
180193
retries: 3
181194
retry-exempt-status-codes: 400,401,404,422
182195
script: |

‎.github/workflows/scheduled-full-run-card.yml‎

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -121,9 +121,22 @@ jobs:
121121
# Same transient-retry posture as merge-queue-triage.yml, and for the
122122
# same reason: 403 is REMOVED from the exempt list because GitHub
123123
# answers a secondary rate limit with 403 as well as 429, and this job
124-
# pages issues. 400/401/404/422 stay exempt — a malformed request or a
125-
# body past the 65536-character limit is this repo's own bug and is
126-
# not improved by asking again.
124+
# pages issues. 400/401/404/422 stay exempt — a malformed request or
125+
# an oversized body is this repo's own bug and is not improved by
126+
# asking again. The size that makes a body oversized is MEASURED, in
127+
# UTF-8 BYTES: this job writes an ISSUE BODY, which stores 262,144
128+
# bytes and refuses 262,145 (objectstack#18793, bisected to one byte;
129+
# restated as `ISSUE_BODY_LIMIT` in scripts/pm/check-half-states.mjs).
130+
# ⛔ Not the 65,536 characters this comment used to name, and ⛔ not
131+
# the number in GitHub's own refusal text either — that string still
132+
# reads "maximum is 65536 characters" and objectstack#18826 falsified
133+
# it in both unit and value by storing a 262,144-character comment.
134+
# ⚠️ On `issues.update` an oversized body is not a 422 at all: the
135+
# platform answers 200, keeps the OLD body and reports nothing
136+
# (#18793). The 422 exemption stays right for the malformed request it
137+
# also covers, and `issues.create` DOES answer 422 on an oversized
138+
# body (#18826) — but ⛔ a refresh that outgrows the cap never reaches
139+
# it.
127140
retries: 3
128141
retry-exempt-status-codes: 400,401,404,422
129142
script: |

‎.github/workflows/test-nightly-tiers.yml‎

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -433,8 +433,19 @@ jobs:
433433
const failing = read('failing-files.txt').split('\n').map((s) => s.trim()).filter(Boolean);
434434
const extractorExit = process.env.FAILING_FILES_EXIT;
435435
436-
// The log tails, bounded: a GitHub issue body caps at 65536 chars,
437-
// and the run link carries the whole log anyway.
436+
// The log tails, bounded. ⛔ The bound below is NOT the platform
437+
// cap, and the platform cap is not 65,536 of anything. This step
438+
// posts an ISSUE BODY, and that surface is MEASURED, in UTF-8
439+
// BYTES: 262,144 bytes stored, 262,145 refused — bisected to one
440+
// byte on objectstack#18793, and restated as `ISSUE_BODY_LIMIT` in
441+
// scripts/pm/check-half-states.mjs. ⛔ Do not re-derive 65,536 from
442+
// a refusal message: GitHub's own 422 text still says "maximum is
443+
// 65536 characters" and is false in both unit and value —
444+
// objectstack#18826 stored a 262,144-CHARACTER comment. ⚠️ And on
445+
// this surface the refusal is not a 422 at all: an oversized issue
446+
// body is answered 200 with the OLD body kept and nothing reported
447+
// (#18793), so a body that outgrows the cap vanishes silently.
448+
// The run link carries the whole log anyway.
438449
const tails = [];
439450
const reportsDir = path.join(process.env.RUNNER_TEMP, 'nightly-reports');
440451
const walk = (dir) => {
@@ -447,6 +458,16 @@ jobs:
447458
}
448459
};
449460
walk(reportsDir);
461+
// BUDGET is a READING budget, ⛔ not a platform bound, and it is
462+
// deliberately NOT re-sized now that the cap above is known to be
463+
// four times what this file used to assert. 40,000 is about as much
464+
// log tail as a person reads off a card before clicking through,
465+
// and the run link carries every byte elided here — so this number
466+
// is sized against the reader, and a correction to the cap moves a
467+
// reading, never a licence to print more. It is counted in the unit
468+
// the slice below uses (JS string length, i.e. UTF-16 code units),
469+
// because nothing judges it against the byte cap: even as bytes of
470+
// CJK prose it stays far under 262,144.
450471
const BUDGET = 40000;
451472
const perTail = Math.max(2000, Math.floor(BUDGET / Math.max(1, tails.length)));
452473
const tailBlocks = tails.sort((a, b) => a.shard.localeCompare(b.shard)).flatMap(({ shard, text }) => [

0 commit comments

Comments
 (0)