fix(hooks): correct the false deferral claim in check-regen-pending.mjs and .githooks/pre-commit - #14545

Merged
baozhoutao merged 2 commits into
mainfrom
claude/issue-14470-deferral-prose
Sep 2, 2026
Merged

fix(hooks): correct the false deferral claim in check-regen-pending.mjs and .githooks/pre-commit#14545
baozhoutao merged 2 commits into
mainfrom
claude/issue-14470-deferral-prose

Conversation

@baozhoutao

Copy link
Copy Markdown
Contributor

Fixes#14470

Both sibling copies of the false "records a DEFERRAL" claim corrected in scripts/pm/os-regen-merge.sh by #14154 survived: the refuse-stale message in scripts/check-regen-pending.mjs and the header of .githooks/pre-commit. Both said this hook records the sanctioned landing sequence's step-3 commit as a deferral. It does not — step 1's merge (git merge --no-edit) auto-commits with no hook run at all (git skips pre-commit for a merge it completes itself), so the marker is untouched going into step 3, whose commit is an ordinary one this hook refuses on purpose. That refusal is the designed collection point, not a deferral.

The deferral mode (#8047) is real, but applies only to a merge commit finished BY HAND with MERGE_HEAD present at commit time — a conflicted merge an operator resolves and finishes with git commit. Both texts now state that precisely, mirroring the reference wording already correct in scripts/pm/os-regen-merge.sh:110-115.

Old → new

scripts/check-regen-pending.mjs (refuse-stale message):

  • Old: "Landing a merge? bash scripts/pm/os-regen-merge.sh runs the sanctioned sequence — it commits the merge first (this hook records that as a deferral) and regeneration follows as its own commit."
  • New: "Landing a merge? bash scripts/pm/os-regen-merge.sh runs the sanctioned sequence — its merge auto-commits first with no hook run at all (git skips pre-commit for a merge it completes itself), so THIS refusal, on the ordinary commit right after, is that sequence's designed collection point — not a deferral. Regeneration follows as its own commit."

.githooks/pre-commit (header):

  • Old: "One commit is exempt, and only one: the MERGE commit itself, which the sanctioned landing sequence (scripts/pm/os-regen-merge.sh, step 3) commits BEFORE regenerating... That commit records a deferral instead of being refused."
  • New: "One commit is exempt, and only one: a MERGE commit finished BY HAND, with MERGE_HEAD present at commit time... The sanctioned landing sequence (scripts/pm/os-regen-merge.sh) does NOT hit that exemption: its step 1 merge auto-commits with no hook run at all..., so the marker is untouched going into step 3, whose commit is an ORDINARY one this hook refuses on purpose — that refusal is the designed collection point... not a deferral."

Scope

Prose only, two files, no behaviour change — decide() and every code path are untouched. #14154's triage already ruled the hook's behaviour correct; this card only corrects the two sentences describing it.

Verification

  • node scripts/check-regen-pending.mjs --self-test — pass (on the merged tree, head b5986fd2d).
  • Live-triggered the new refuse-stale text in a throwaway repo (no merge, no deferral, a pending marker naming a real REGEN_ARTIFACTS entry): exit 1, printed the new sentence verbatim.
  • Readers of .githooks/pre-commit (git grep -n "githooks/pre-commit" -- scripts .github): check-bash32-floor (--self-test 153 cases + live check), check-regen-pending.mjs's own self-test, git-merge-regen.mjs --self-test — all pass; lint.yml's reference is prose-only.
  • node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands scripts/check-regen-pending.mjs .githooks/pre-commit → 18 commands, all run → --ran: 18 derived, 18 run, 0 NOT-MEASURED, 0 UNRUN.
  • pnpm check:ratchet-remedy-authority, pnpm check:declared-population-live, node scripts/check-self-test-wired.mjs, pnpm check:bash32-floor — all pass.
  • Narrowed lint (eslint --no-inline-config scripts/check-regen-pending.mjs) — clean.
  • git fetch origin main && git merge origin/main (clean, no conflicts) → self-test re-run on merged tree b5986fd2d — pass.

No third copy of either sentence repo-wide; no test pins the old text.

Changeset

scripts/** + .githooks/ — publishes nothing, so no changeset. skip-changeset label applied (REST), per the convention PR #14468 followed.

Generated by Claude Code


Generated by Claude Code

…js and .githooks/pre-commit
Both sibling copies of the false claim corrected in os-regen-merge.sh by
#14154 survived: the hook's refuse-stale message and the pre-commit header
still said this hook records the sanctioned landing sequence's step-3
commit as a deferral. It does not — step 1's merge auto-commits with no
hook run at all (git skips pre-commit for a merge it completes itself), so
the marker is untouched going into step 3, whose commit is an ordinary one
this hook refuses on purpose. That refusal is the designed collection
point, not a deferral.
The deferral mode (#8047) is real, but applies only to a merge commit
finished BY HAND with MERGE_HEAD present at commit time — a conflicted
merge an operator resolves and finishes with `git commit`. Both texts now
state that precisely, mirroring the reference wording already correct in
scripts/pm/os-regen-merge.sh:110-115.
Fixes#14470
Co-Authored-By: Claude Code <noreply@anthropic.com>
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 2, 2026
@baozhoutao
baozhoutao marked this pull request as ready for review September 2, 2026 11:28
@baozhoutao
baozhoutao added this pull request to the merge queueSep 2, 2026
Merged via the queue into main with commit e6fd6b2Sep 2, 2026
36 checks passed
@baozhoutao
baozhoutao deleted the claude/issue-14470-deferral-prose branch September 2, 2026 12:25
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/sskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants

@baozhoutao@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix(hooks): correct the false deferral claim in check-regen-pending.mjs and .githooks/pre-commit - #14545

Merged
baozhoutao merged 2 commits into
mainfrom
claude/issue-14470-deferral-prose
Sep 2, 2026
Merged

fix(hooks): correct the false deferral claim in check-regen-pending.mjs and .githooks/pre-commit#14545
baozhoutao merged 2 commits into
mainfrom
claude/issue-14470-deferral-prose

Conversation

@baozhoutao

Copy link
Copy Markdown
Contributor

Fixes#14470

Both sibling copies of the false "records a DEFERRAL" claim corrected in scripts/pm/os-regen-merge.sh by #14154 survived: the refuse-stale message in scripts/check-regen-pending.mjs and the header of .githooks/pre-commit. Both said this hook records the sanctioned landing sequence's step-3 commit as a deferral. It does not — step 1's merge (git merge --no-edit) auto-commits with no hook run at all (git skips pre-commit for a merge it completes itself), so the marker is untouched going into step 3, whose commit is an ordinary one this hook refuses on purpose. That refusal is the designed collection point, not a deferral.

The deferral mode (#8047) is real, but applies only to a merge commit finished BY HAND with MERGE_HEAD present at commit time — a conflicted merge an operator resolves and finishes with git commit. Both texts now state that precisely, mirroring the reference wording already correct in scripts/pm/os-regen-merge.sh:110-115.

Old → new

scripts/check-regen-pending.mjs (refuse-stale message):

  • Old: "Landing a merge? bash scripts/pm/os-regen-merge.sh runs the sanctioned sequence — it commits the merge first (this hook records that as a deferral) and regeneration follows as its own commit."
  • New: "Landing a merge? bash scripts/pm/os-regen-merge.sh runs the sanctioned sequence — its merge auto-commits first with no hook run at all (git skips pre-commit for a merge it completes itself), so THIS refusal, on the ordinary commit right after, is that sequence's designed collection point — not a deferral. Regeneration follows as its own commit."

.githooks/pre-commit (header):

  • Old: "One commit is exempt, and only one: the MERGE commit itself, which the sanctioned landing sequence (scripts/pm/os-regen-merge.sh, step 3) commits BEFORE regenerating... That commit records a deferral instead of being refused."
  • New: "One commit is exempt, and only one: a MERGE commit finished BY HAND, with MERGE_HEAD present at commit time... The sanctioned landing sequence (scripts/pm/os-regen-merge.sh) does NOT hit that exemption: its step 1 merge auto-commits with no hook run at all..., so the marker is untouched going into step 3, whose commit is an ORDINARY one this hook refuses on purpose — that refusal is the designed collection point... not a deferral."

Scope

Prose only, two files, no behaviour change — decide() and every code path are untouched. #14154's triage already ruled the hook's behaviour correct; this card only corrects the two sentences describing it.

Verification

  • node scripts/check-regen-pending.mjs --self-test — pass (on the merged tree, head b5986fd2d).
  • Live-triggered the new refuse-stale text in a throwaway repo (no merge, no deferral, a pending marker naming a real REGEN_ARTIFACTS entry): exit 1, printed the new sentence verbatim.
  • Readers of .githooks/pre-commit (git grep -n "githooks/pre-commit" -- scripts .github): check-bash32-floor (--self-test 153 cases + live check), check-regen-pending.mjs's own self-test, git-merge-regen.mjs --self-test — all pass; lint.yml's reference is prose-only.
  • node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands scripts/check-regen-pending.mjs .githooks/pre-commit → 18 commands, all run → --ran: 18 derived, 18 run, 0 NOT-MEASURED, 0 UNRUN.
  • pnpm check:ratchet-remedy-authority, pnpm check:declared-population-live, node scripts/check-self-test-wired.mjs, pnpm check:bash32-floor — all pass.
  • Narrowed lint (eslint --no-inline-config scripts/check-regen-pending.mjs) — clean.
  • git fetch origin main && git merge origin/main (clean, no conflicts) → self-test re-run on merged tree b5986fd2d — pass.

No third copy of either sentence repo-wide; no test pins the old text.

Changeset

scripts/** + .githooks/ — publishes nothing, so no changeset. skip-changeset label applied (REST), per the convention PR #14468 followed.

Generated by Claude Code


Generated by Claude Code

…js and .githooks/pre-commit
Both sibling copies of the false claim corrected in os-regen-merge.sh by
#14154 survived: the hook's refuse-stale message and the pre-commit header
still said this hook records the sanctioned landing sequence's step-3
commit as a deferral. It does not — step 1's merge auto-commits with no
hook run at all (git skips pre-commit for a merge it completes itself), so
the marker is untouched going into step 3, whose commit is an ordinary one
this hook refuses on purpose. That refusal is the designed collection
point, not a deferral.
The deferral mode (#8047) is real, but applies only to a merge commit
finished BY HAND with MERGE_HEAD present at commit time — a conflicted
merge an operator resolves and finishes with `git commit`. Both texts now
state that precisely, mirroring the reference wording already correct in
scripts/pm/os-regen-merge.sh:110-115.
Fixes#14470
Co-Authored-By: Claude Code <noreply@anthropic.com>
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 2, 2026
@baozhoutao
baozhoutao marked this pull request as ready for review September 2, 2026 11:28
@baozhoutao
baozhoutao added this pull request to the merge queueSep 2, 2026
Merged via the queue into main with commit e6fd6b2Sep 2, 2026
36 checks passed
@baozhoutao
baozhoutao deleted the claude/issue-14470-deferral-prose branch September 2, 2026 12:25
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/sskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants

@baozhoutao@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(hooks): correct the false deferral claim in check-regen-pending.mjs and .githooks/pre-commit - #14545

Merged
baozhoutao merged 2 commits into
mainfrom
claude/issue-14470-deferral-prose
Sep 2, 2026
Merged

fix(hooks): correct the false deferral claim in check-regen-pending.mjs and .githooks/pre-commit#14545
baozhoutao merged 2 commits into
mainfrom
claude/issue-14470-deferral-prose

Conversation

@baozhoutao

Copy link
Copy Markdown
Contributor

Fixes#14470

Both sibling copies of the false "records a DEFERRAL" claim corrected in scripts/pm/os-regen-merge.sh by #14154 survived: the refuse-stale message in scripts/check-regen-pending.mjs and the header of .githooks/pre-commit. Both said this hook records the sanctioned landing sequence's step-3 commit as a deferral. It does not — step 1's merge (git merge --no-edit) auto-commits with no hook run at all (git skips pre-commit for a merge it completes itself), so the marker is untouched going into step 3, whose commit is an ordinary one this hook refuses on purpose. That refusal is the designed collection point, not a deferral.

The deferral mode (#8047) is real, but applies only to a merge commit finished BY HAND with MERGE_HEAD present at commit time — a conflicted merge an operator resolves and finishes with git commit. Both texts now state that precisely, mirroring the reference wording already correct in scripts/pm/os-regen-merge.sh:110-115.

Old → new

scripts/check-regen-pending.mjs (refuse-stale message):

  • Old: "Landing a merge? bash scripts/pm/os-regen-merge.sh runs the sanctioned sequence — it commits the merge first (this hook records that as a deferral) and regeneration follows as its own commit."
  • New: "Landing a merge? bash scripts/pm/os-regen-merge.sh runs the sanctioned sequence — its merge auto-commits first with no hook run at all (git skips pre-commit for a merge it completes itself), so THIS refusal, on the ordinary commit right after, is that sequence's designed collection point — not a deferral. Regeneration follows as its own commit."

.githooks/pre-commit (header):

  • Old: "One commit is exempt, and only one: the MERGE commit itself, which the sanctioned landing sequence (scripts/pm/os-regen-merge.sh, step 3) commits BEFORE regenerating... That commit records a deferral instead of being refused."
  • New: "One commit is exempt, and only one: a MERGE commit finished BY HAND, with MERGE_HEAD present at commit time... The sanctioned landing sequence (scripts/pm/os-regen-merge.sh) does NOT hit that exemption: its step 1 merge auto-commits with no hook run at all..., so the marker is untouched going into step 3, whose commit is an ORDINARY one this hook refuses on purpose — that refusal is the designed collection point... not a deferral."

Scope

Prose only, two files, no behaviour change — decide() and every code path are untouched. #14154's triage already ruled the hook's behaviour correct; this card only corrects the two sentences describing it.

Verification

  • node scripts/check-regen-pending.mjs --self-test — pass (on the merged tree, head b5986fd2d).
  • Live-triggered the new refuse-stale text in a throwaway repo (no merge, no deferral, a pending marker naming a real REGEN_ARTIFACTS entry): exit 1, printed the new sentence verbatim.
  • Readers of .githooks/pre-commit (git grep -n "githooks/pre-commit" -- scripts .github): check-bash32-floor (--self-test 153 cases + live check), check-regen-pending.mjs's own self-test, git-merge-regen.mjs --self-test — all pass; lint.yml's reference is prose-only.
  • node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands scripts/check-regen-pending.mjs .githooks/pre-commit → 18 commands, all run → --ran: 18 derived, 18 run, 0 NOT-MEASURED, 0 UNRUN.
  • pnpm check:ratchet-remedy-authority, pnpm check:declared-population-live, node scripts/check-self-test-wired.mjs, pnpm check:bash32-floor — all pass.
  • Narrowed lint (eslint --no-inline-config scripts/check-regen-pending.mjs) — clean.
  • git fetch origin main && git merge origin/main (clean, no conflicts) → self-test re-run on merged tree b5986fd2d — pass.

No third copy of either sentence repo-wide; no test pins the old text.

Changeset

scripts/** + .githooks/ — publishes nothing, so no changeset. skip-changeset label applied (REST), per the convention PR #14468 followed.

Generated by Claude Code


Generated by Claude Code

…js and .githooks/pre-commit
Both sibling copies of the false claim corrected in os-regen-merge.sh by
#14154 survived: the hook's refuse-stale message and the pre-commit header
still said this hook records the sanctioned landing sequence's step-3
commit as a deferral. It does not — step 1's merge auto-commits with no
hook run at all (git skips pre-commit for a merge it completes itself), so
the marker is untouched going into step 3, whose commit is an ordinary one
this hook refuses on purpose. That refusal is the designed collection
point, not a deferral.
The deferral mode (#8047) is real, but applies only to a merge commit
finished BY HAND with MERGE_HEAD present at commit time — a conflicted
merge an operator resolves and finishes with `git commit`. Both texts now
state that precisely, mirroring the reference wording already correct in
scripts/pm/os-regen-merge.sh:110-115.
Fixes#14470
Co-Authored-By: Claude Code <noreply@anthropic.com>
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 2, 2026
@baozhoutao
baozhoutao marked this pull request as ready for review September 2, 2026 11:28
@baozhoutao
baozhoutao added this pull request to the merge queueSep 2, 2026
Merged via the queue into main with commit e6fd6b2Sep 2, 2026
36 checks passed
@baozhoutao
baozhoutao deleted the claude/issue-14470-deferral-prose branch September 2, 2026 12:25
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/sskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants

@baozhoutao@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(hooks): correct the false deferral claim in check-regen-pending.mjs and .githooks/pre-commit - #14545

Merged
baozhoutao merged 2 commits into
mainfrom
claude/issue-14470-deferral-prose
Sep 2, 2026
Merged

fix(hooks): correct the false deferral claim in check-regen-pending.mjs and .githooks/pre-commit#14545
baozhoutao merged 2 commits into
mainfrom
claude/issue-14470-deferral-prose

Conversation

@baozhoutao

Copy link
Copy Markdown
Contributor

Fixes#14470

Both sibling copies of the false "records a DEFERRAL" claim corrected in scripts/pm/os-regen-merge.sh by #14154 survived: the refuse-stale message in scripts/check-regen-pending.mjs and the header of .githooks/pre-commit. Both said this hook records the sanctioned landing sequence's step-3 commit as a deferral. It does not — step 1's merge (git merge --no-edit) auto-commits with no hook run at all (git skips pre-commit for a merge it completes itself), so the marker is untouched going into step 3, whose commit is an ordinary one this hook refuses on purpose. That refusal is the designed collection point, not a deferral.

The deferral mode (#8047) is real, but applies only to a merge commit finished BY HAND with MERGE_HEAD present at commit time — a conflicted merge an operator resolves and finishes with git commit. Both texts now state that precisely, mirroring the reference wording already correct in scripts/pm/os-regen-merge.sh:110-115.

Old → new

scripts/check-regen-pending.mjs (refuse-stale message):

  • Old: "Landing a merge? bash scripts/pm/os-regen-merge.sh runs the sanctioned sequence — it commits the merge first (this hook records that as a deferral) and regeneration follows as its own commit."
  • New: "Landing a merge? bash scripts/pm/os-regen-merge.sh runs the sanctioned sequence — its merge auto-commits first with no hook run at all (git skips pre-commit for a merge it completes itself), so THIS refusal, on the ordinary commit right after, is that sequence's designed collection point — not a deferral. Regeneration follows as its own commit."

.githooks/pre-commit (header):

  • Old: "One commit is exempt, and only one: the MERGE commit itself, which the sanctioned landing sequence (scripts/pm/os-regen-merge.sh, step 3) commits BEFORE regenerating... That commit records a deferral instead of being refused."
  • New: "One commit is exempt, and only one: a MERGE commit finished BY HAND, with MERGE_HEAD present at commit time... The sanctioned landing sequence (scripts/pm/os-regen-merge.sh) does NOT hit that exemption: its step 1 merge auto-commits with no hook run at all..., so the marker is untouched going into step 3, whose commit is an ORDINARY one this hook refuses on purpose — that refusal is the designed collection point... not a deferral."

Scope

Prose only, two files, no behaviour change — decide() and every code path are untouched. #14154's triage already ruled the hook's behaviour correct; this card only corrects the two sentences describing it.

Verification

  • node scripts/check-regen-pending.mjs --self-test — pass (on the merged tree, head b5986fd2d).
  • Live-triggered the new refuse-stale text in a throwaway repo (no merge, no deferral, a pending marker naming a real REGEN_ARTIFACTS entry): exit 1, printed the new sentence verbatim.
  • Readers of .githooks/pre-commit (git grep -n "githooks/pre-commit" -- scripts .github): check-bash32-floor (--self-test 153 cases + live check), check-regen-pending.mjs's own self-test, git-merge-regen.mjs --self-test — all pass; lint.yml's reference is prose-only.
  • node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands scripts/check-regen-pending.mjs .githooks/pre-commit → 18 commands, all run → --ran: 18 derived, 18 run, 0 NOT-MEASURED, 0 UNRUN.
  • pnpm check:ratchet-remedy-authority, pnpm check:declared-population-live, node scripts/check-self-test-wired.mjs, pnpm check:bash32-floor — all pass.
  • Narrowed lint (eslint --no-inline-config scripts/check-regen-pending.mjs) — clean.
  • git fetch origin main && git merge origin/main (clean, no conflicts) → self-test re-run on merged tree b5986fd2d — pass.

No third copy of either sentence repo-wide; no test pins the old text.

Changeset

scripts/** + .githooks/ — publishes nothing, so no changeset. skip-changeset label applied (REST), per the convention PR #14468 followed.

Generated by Claude Code


Generated by Claude Code

…js and .githooks/pre-commit
Both sibling copies of the false claim corrected in os-regen-merge.sh by
#14154 survived: the hook's refuse-stale message and the pre-commit header
still said this hook records the sanctioned landing sequence's step-3
commit as a deferral. It does not — step 1's merge auto-commits with no
hook run at all (git skips pre-commit for a merge it completes itself), so
the marker is untouched going into step 3, whose commit is an ordinary one
this hook refuses on purpose. That refusal is the designed collection
point, not a deferral.
The deferral mode (#8047) is real, but applies only to a merge commit
finished BY HAND with MERGE_HEAD present at commit time — a conflicted
merge an operator resolves and finishes with `git commit`. Both texts now
state that precisely, mirroring the reference wording already correct in
scripts/pm/os-regen-merge.sh:110-115.
Fixes#14470
Co-Authored-By: Claude Code <noreply@anthropic.com>
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 2, 2026
@baozhoutao
baozhoutao marked this pull request as ready for review September 2, 2026 11:28
@baozhoutao
baozhoutao added this pull request to the merge queueSep 2, 2026
Merged via the queue into main with commit e6fd6b2Sep 2, 2026
36 checks passed
@baozhoutao
baozhoutao deleted the claude/issue-14470-deferral-prose branch September 2, 2026 12:25
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/sskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants

@baozhoutao@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix(hooks): correct the false deferral claim in check-regen-pending.mjs and .githooks/pre-commit - #14545

Merged
baozhoutao merged 2 commits into
mainfrom
claude/issue-14470-deferral-prose
Sep 2, 2026
Merged

fix(hooks): correct the false deferral claim in check-regen-pending.mjs and .githooks/pre-commit#14545
baozhoutao merged 2 commits into
mainfrom
claude/issue-14470-deferral-prose

Conversation

@baozhoutao

Copy link
Copy Markdown
Contributor

Fixes#14470

Both sibling copies of the false "records a DEFERRAL" claim corrected in scripts/pm/os-regen-merge.sh by #14154 survived: the refuse-stale message in scripts/check-regen-pending.mjs and the header of .githooks/pre-commit. Both said this hook records the sanctioned landing sequence's step-3 commit as a deferral. It does not — step 1's merge (git merge --no-edit) auto-commits with no hook run at all (git skips pre-commit for a merge it completes itself), so the marker is untouched going into step 3, whose commit is an ordinary one this hook refuses on purpose. That refusal is the designed collection point, not a deferral.

The deferral mode (#8047) is real, but applies only to a merge commit finished BY HAND with MERGE_HEAD present at commit time — a conflicted merge an operator resolves and finishes with git commit. Both texts now state that precisely, mirroring the reference wording already correct in scripts/pm/os-regen-merge.sh:110-115.

Old → new

scripts/check-regen-pending.mjs (refuse-stale message):

  • Old: "Landing a merge? bash scripts/pm/os-regen-merge.sh runs the sanctioned sequence — it commits the merge first (this hook records that as a deferral) and regeneration follows as its own commit."
  • New: "Landing a merge? bash scripts/pm/os-regen-merge.sh runs the sanctioned sequence — its merge auto-commits first with no hook run at all (git skips pre-commit for a merge it completes itself), so THIS refusal, on the ordinary commit right after, is that sequence's designed collection point — not a deferral. Regeneration follows as its own commit."

.githooks/pre-commit (header):

  • Old: "One commit is exempt, and only one: the MERGE commit itself, which the sanctioned landing sequence (scripts/pm/os-regen-merge.sh, step 3) commits BEFORE regenerating... That commit records a deferral instead of being refused."
  • New: "One commit is exempt, and only one: a MERGE commit finished BY HAND, with MERGE_HEAD present at commit time... The sanctioned landing sequence (scripts/pm/os-regen-merge.sh) does NOT hit that exemption: its step 1 merge auto-commits with no hook run at all..., so the marker is untouched going into step 3, whose commit is an ORDINARY one this hook refuses on purpose — that refusal is the designed collection point... not a deferral."

Scope

Prose only, two files, no behaviour change — decide() and every code path are untouched. #14154's triage already ruled the hook's behaviour correct; this card only corrects the two sentences describing it.

Verification

  • node scripts/check-regen-pending.mjs --self-test — pass (on the merged tree, head b5986fd2d).
  • Live-triggered the new refuse-stale text in a throwaway repo (no merge, no deferral, a pending marker naming a real REGEN_ARTIFACTS entry): exit 1, printed the new sentence verbatim.
  • Readers of .githooks/pre-commit (git grep -n "githooks/pre-commit" -- scripts .github): check-bash32-floor (--self-test 153 cases + live check), check-regen-pending.mjs's own self-test, git-merge-regen.mjs --self-test — all pass; lint.yml's reference is prose-only.
  • node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands scripts/check-regen-pending.mjs .githooks/pre-commit → 18 commands, all run → --ran: 18 derived, 18 run, 0 NOT-MEASURED, 0 UNRUN.
  • pnpm check:ratchet-remedy-authority, pnpm check:declared-population-live, node scripts/check-self-test-wired.mjs, pnpm check:bash32-floor — all pass.
  • Narrowed lint (eslint --no-inline-config scripts/check-regen-pending.mjs) — clean.
  • git fetch origin main && git merge origin/main (clean, no conflicts) → self-test re-run on merged tree b5986fd2d — pass.

No third copy of either sentence repo-wide; no test pins the old text.

Changeset

scripts/** + .githooks/ — publishes nothing, so no changeset. skip-changeset label applied (REST), per the convention PR #14468 followed.

Generated by Claude Code


Generated by Claude Code

…js and .githooks/pre-commit
Both sibling copies of the false claim corrected in os-regen-merge.sh by
#14154 survived: the hook's refuse-stale message and the pre-commit header
still said this hook records the sanctioned landing sequence's step-3
commit as a deferral. It does not — step 1's merge auto-commits with no
hook run at all (git skips pre-commit for a merge it completes itself), so
the marker is untouched going into step 3, whose commit is an ordinary one
this hook refuses on purpose. That refusal is the designed collection
point, not a deferral.
The deferral mode (#8047) is real, but applies only to a merge commit
finished BY HAND with MERGE_HEAD present at commit time — a conflicted
merge an operator resolves and finishes with `git commit`. Both texts now
state that precisely, mirroring the reference wording already correct in
scripts/pm/os-regen-merge.sh:110-115.
Fixes#14470
Co-Authored-By: Claude Code <noreply@anthropic.com>
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 2, 2026
@baozhoutao
baozhoutao marked this pull request as ready for review September 2, 2026 11:28
@baozhoutao
baozhoutao added this pull request to the merge queueSep 2, 2026
Merged via the queue into main with commit e6fd6b2Sep 2, 2026
36 checks passed
@baozhoutao
baozhoutao deleted the claude/issue-14470-deferral-prose branch September 2, 2026 12:25
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/sskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants

@baozhoutao@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(hooks): correct the false deferral claim in check-regen-pending.mjs and .githooks/pre-commit - #14545

Merged
baozhoutao merged 2 commits into
mainfrom
claude/issue-14470-deferral-prose
Sep 2, 2026
Merged

fix(hooks): correct the false deferral claim in check-regen-pending.mjs and .githooks/pre-commit#14545
baozhoutao merged 2 commits into
mainfrom
claude/issue-14470-deferral-prose

Conversation

@baozhoutao

Copy link
Copy Markdown
Contributor

Fixes#14470

Both sibling copies of the false "records a DEFERRAL" claim corrected in scripts/pm/os-regen-merge.sh by #14154 survived: the refuse-stale message in scripts/check-regen-pending.mjs and the header of .githooks/pre-commit. Both said this hook records the sanctioned landing sequence's step-3 commit as a deferral. It does not — step 1's merge (git merge --no-edit) auto-commits with no hook run at all (git skips pre-commit for a merge it completes itself), so the marker is untouched going into step 3, whose commit is an ordinary one this hook refuses on purpose. That refusal is the designed collection point, not a deferral.

The deferral mode (#8047) is real, but applies only to a merge commit finished BY HAND with MERGE_HEAD present at commit time — a conflicted merge an operator resolves and finishes with git commit. Both texts now state that precisely, mirroring the reference wording already correct in scripts/pm/os-regen-merge.sh:110-115.

Old → new

scripts/check-regen-pending.mjs (refuse-stale message):

  • Old: "Landing a merge? bash scripts/pm/os-regen-merge.sh runs the sanctioned sequence — it commits the merge first (this hook records that as a deferral) and regeneration follows as its own commit."
  • New: "Landing a merge? bash scripts/pm/os-regen-merge.sh runs the sanctioned sequence — its merge auto-commits first with no hook run at all (git skips pre-commit for a merge it completes itself), so THIS refusal, on the ordinary commit right after, is that sequence's designed collection point — not a deferral. Regeneration follows as its own commit."

.githooks/pre-commit (header):

  • Old: "One commit is exempt, and only one: the MERGE commit itself, which the sanctioned landing sequence (scripts/pm/os-regen-merge.sh, step 3) commits BEFORE regenerating... That commit records a deferral instead of being refused."
  • New: "One commit is exempt, and only one: a MERGE commit finished BY HAND, with MERGE_HEAD present at commit time... The sanctioned landing sequence (scripts/pm/os-regen-merge.sh) does NOT hit that exemption: its step 1 merge auto-commits with no hook run at all..., so the marker is untouched going into step 3, whose commit is an ORDINARY one this hook refuses on purpose — that refusal is the designed collection point... not a deferral."

Scope

Prose only, two files, no behaviour change — decide() and every code path are untouched. #14154's triage already ruled the hook's behaviour correct; this card only corrects the two sentences describing it.

Verification

  • node scripts/check-regen-pending.mjs --self-test — pass (on the merged tree, head b5986fd2d).
  • Live-triggered the new refuse-stale text in a throwaway repo (no merge, no deferral, a pending marker naming a real REGEN_ARTIFACTS entry): exit 1, printed the new sentence verbatim.
  • Readers of .githooks/pre-commit (git grep -n "githooks/pre-commit" -- scripts .github): check-bash32-floor (--self-test 153 cases + live check), check-regen-pending.mjs's own self-test, git-merge-regen.mjs --self-test — all pass; lint.yml's reference is prose-only.
  • node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands scripts/check-regen-pending.mjs .githooks/pre-commit → 18 commands, all run → --ran: 18 derived, 18 run, 0 NOT-MEASURED, 0 UNRUN.
  • pnpm check:ratchet-remedy-authority, pnpm check:declared-population-live, node scripts/check-self-test-wired.mjs, pnpm check:bash32-floor — all pass.
  • Narrowed lint (eslint --no-inline-config scripts/check-regen-pending.mjs) — clean.
  • git fetch origin main && git merge origin/main (clean, no conflicts) → self-test re-run on merged tree b5986fd2d — pass.

No third copy of either sentence repo-wide; no test pins the old text.

Changeset

scripts/** + .githooks/ — publishes nothing, so no changeset. skip-changeset label applied (REST), per the convention PR #14468 followed.

Generated by Claude Code


Generated by Claude Code

…js and .githooks/pre-commit
Both sibling copies of the false claim corrected in os-regen-merge.sh by
#14154 survived: the hook's refuse-stale message and the pre-commit header
still said this hook records the sanctioned landing sequence's step-3
commit as a deferral. It does not — step 1's merge auto-commits with no
hook run at all (git skips pre-commit for a merge it completes itself), so
the marker is untouched going into step 3, whose commit is an ordinary one
this hook refuses on purpose. That refusal is the designed collection
point, not a deferral.
The deferral mode (#8047) is real, but applies only to a merge commit
finished BY HAND with MERGE_HEAD present at commit time — a conflicted
merge an operator resolves and finishes with `git commit`. Both texts now
state that precisely, mirroring the reference wording already correct in
scripts/pm/os-regen-merge.sh:110-115.
Fixes#14470
Co-Authored-By: Claude Code <noreply@anthropic.com>
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 2, 2026
@baozhoutao
baozhoutao marked this pull request as ready for review September 2, 2026 11:28
@baozhoutao
baozhoutao added this pull request to the merge queueSep 2, 2026
Merged via the queue into main with commit e6fd6b2Sep 2, 2026
36 checks passed
@baozhoutao
baozhoutao deleted the claude/issue-14470-deferral-prose branch September 2, 2026 12:25
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/sskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants

@baozhoutao@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(hooks): correct the false deferral claim in check-regen-pending.mjs and .githooks/pre-commit - #14545

Merged
baozhoutao merged 2 commits into
mainfrom
claude/issue-14470-deferral-prose
Sep 2, 2026
Merged

fix(hooks): correct the false deferral claim in check-regen-pending.mjs and .githooks/pre-commit#14545
baozhoutao merged 2 commits into
mainfrom
claude/issue-14470-deferral-prose

Conversation

@baozhoutao

Copy link
Copy Markdown
Contributor

Fixes#14470

Both sibling copies of the false "records a DEFERRAL" claim corrected in scripts/pm/os-regen-merge.sh by #14154 survived: the refuse-stale message in scripts/check-regen-pending.mjs and the header of .githooks/pre-commit. Both said this hook records the sanctioned landing sequence's step-3 commit as a deferral. It does not — step 1's merge (git merge --no-edit) auto-commits with no hook run at all (git skips pre-commit for a merge it completes itself), so the marker is untouched going into step 3, whose commit is an ordinary one this hook refuses on purpose. That refusal is the designed collection point, not a deferral.

The deferral mode (#8047) is real, but applies only to a merge commit finished BY HAND with MERGE_HEAD present at commit time — a conflicted merge an operator resolves and finishes with git commit. Both texts now state that precisely, mirroring the reference wording already correct in scripts/pm/os-regen-merge.sh:110-115.

Old → new

scripts/check-regen-pending.mjs (refuse-stale message):

  • Old: "Landing a merge? bash scripts/pm/os-regen-merge.sh runs the sanctioned sequence — it commits the merge first (this hook records that as a deferral) and regeneration follows as its own commit."
  • New: "Landing a merge? bash scripts/pm/os-regen-merge.sh runs the sanctioned sequence — its merge auto-commits first with no hook run at all (git skips pre-commit for a merge it completes itself), so THIS refusal, on the ordinary commit right after, is that sequence's designed collection point — not a deferral. Regeneration follows as its own commit."

.githooks/pre-commit (header):

  • Old: "One commit is exempt, and only one: the MERGE commit itself, which the sanctioned landing sequence (scripts/pm/os-regen-merge.sh, step 3) commits BEFORE regenerating... That commit records a deferral instead of being refused."
  • New: "One commit is exempt, and only one: a MERGE commit finished BY HAND, with MERGE_HEAD present at commit time... The sanctioned landing sequence (scripts/pm/os-regen-merge.sh) does NOT hit that exemption: its step 1 merge auto-commits with no hook run at all..., so the marker is untouched going into step 3, whose commit is an ORDINARY one this hook refuses on purpose — that refusal is the designed collection point... not a deferral."

Scope

Prose only, two files, no behaviour change — decide() and every code path are untouched. #14154's triage already ruled the hook's behaviour correct; this card only corrects the two sentences describing it.

Verification

  • node scripts/check-regen-pending.mjs --self-test — pass (on the merged tree, head b5986fd2d).
  • Live-triggered the new refuse-stale text in a throwaway repo (no merge, no deferral, a pending marker naming a real REGEN_ARTIFACTS entry): exit 1, printed the new sentence verbatim.
  • Readers of .githooks/pre-commit (git grep -n "githooks/pre-commit" -- scripts .github): check-bash32-floor (--self-test 153 cases + live check), check-regen-pending.mjs's own self-test, git-merge-regen.mjs --self-test — all pass; lint.yml's reference is prose-only.
  • node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands scripts/check-regen-pending.mjs .githooks/pre-commit → 18 commands, all run → --ran: 18 derived, 18 run, 0 NOT-MEASURED, 0 UNRUN.
  • pnpm check:ratchet-remedy-authority, pnpm check:declared-population-live, node scripts/check-self-test-wired.mjs, pnpm check:bash32-floor — all pass.
  • Narrowed lint (eslint --no-inline-config scripts/check-regen-pending.mjs) — clean.
  • git fetch origin main && git merge origin/main (clean, no conflicts) → self-test re-run on merged tree b5986fd2d — pass.

No third copy of either sentence repo-wide; no test pins the old text.

Changeset

scripts/** + .githooks/ — publishes nothing, so no changeset. skip-changeset label applied (REST), per the convention PR #14468 followed.

Generated by Claude Code


Generated by Claude Code

…js and .githooks/pre-commit
Both sibling copies of the false claim corrected in os-regen-merge.sh by
#14154 survived: the hook's refuse-stale message and the pre-commit header
still said this hook records the sanctioned landing sequence's step-3
commit as a deferral. It does not — step 1's merge auto-commits with no
hook run at all (git skips pre-commit for a merge it completes itself), so
the marker is untouched going into step 3, whose commit is an ordinary one
this hook refuses on purpose. That refusal is the designed collection
point, not a deferral.
The deferral mode (#8047) is real, but applies only to a merge commit
finished BY HAND with MERGE_HEAD present at commit time — a conflicted
merge an operator resolves and finishes with `git commit`. Both texts now
state that precisely, mirroring the reference wording already correct in
scripts/pm/os-regen-merge.sh:110-115.
Fixes#14470
Co-Authored-By: Claude Code <noreply@anthropic.com>
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 2, 2026
@baozhoutao
baozhoutao marked this pull request as ready for review September 2, 2026 11:28
@baozhoutao
baozhoutao added this pull request to the merge queueSep 2, 2026
Merged via the queue into main with commit e6fd6b2Sep 2, 2026
36 checks passed
@baozhoutao
baozhoutao deleted the claude/issue-14470-deferral-prose branch September 2, 2026 12:25
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/sskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants

@baozhoutao@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix(hooks): correct the false deferral claim in check-regen-pending.mjs and .githooks/pre-commit - #14545

Merged
baozhoutao merged 2 commits into
mainfrom
claude/issue-14470-deferral-prose
Sep 2, 2026
Merged

fix(hooks): correct the false deferral claim in check-regen-pending.mjs and .githooks/pre-commit#14545
baozhoutao merged 2 commits into
mainfrom
claude/issue-14470-deferral-prose

Conversation

@baozhoutao

Copy link
Copy Markdown
Contributor

Fixes#14470

Both sibling copies of the false "records a DEFERRAL" claim corrected in scripts/pm/os-regen-merge.sh by #14154 survived: the refuse-stale message in scripts/check-regen-pending.mjs and the header of .githooks/pre-commit. Both said this hook records the sanctioned landing sequence's step-3 commit as a deferral. It does not — step 1's merge (git merge --no-edit) auto-commits with no hook run at all (git skips pre-commit for a merge it completes itself), so the marker is untouched going into step 3, whose commit is an ordinary one this hook refuses on purpose. That refusal is the designed collection point, not a deferral.

The deferral mode (#8047) is real, but applies only to a merge commit finished BY HAND with MERGE_HEAD present at commit time — a conflicted merge an operator resolves and finishes with git commit. Both texts now state that precisely, mirroring the reference wording already correct in scripts/pm/os-regen-merge.sh:110-115.

Old → new

scripts/check-regen-pending.mjs (refuse-stale message):

  • Old: "Landing a merge? bash scripts/pm/os-regen-merge.sh runs the sanctioned sequence — it commits the merge first (this hook records that as a deferral) and regeneration follows as its own commit."
  • New: "Landing a merge? bash scripts/pm/os-regen-merge.sh runs the sanctioned sequence — its merge auto-commits first with no hook run at all (git skips pre-commit for a merge it completes itself), so THIS refusal, on the ordinary commit right after, is that sequence's designed collection point — not a deferral. Regeneration follows as its own commit."

.githooks/pre-commit (header):

  • Old: "One commit is exempt, and only one: the MERGE commit itself, which the sanctioned landing sequence (scripts/pm/os-regen-merge.sh, step 3) commits BEFORE regenerating... That commit records a deferral instead of being refused."
  • New: "One commit is exempt, and only one: a MERGE commit finished BY HAND, with MERGE_HEAD present at commit time... The sanctioned landing sequence (scripts/pm/os-regen-merge.sh) does NOT hit that exemption: its step 1 merge auto-commits with no hook run at all..., so the marker is untouched going into step 3, whose commit is an ORDINARY one this hook refuses on purpose — that refusal is the designed collection point... not a deferral."

Scope

Prose only, two files, no behaviour change — decide() and every code path are untouched. #14154's triage already ruled the hook's behaviour correct; this card only corrects the two sentences describing it.

Verification

  • node scripts/check-regen-pending.mjs --self-test — pass (on the merged tree, head b5986fd2d).
  • Live-triggered the new refuse-stale text in a throwaway repo (no merge, no deferral, a pending marker naming a real REGEN_ARTIFACTS entry): exit 1, printed the new sentence verbatim.
  • Readers of .githooks/pre-commit (git grep -n "githooks/pre-commit" -- scripts .github): check-bash32-floor (--self-test 153 cases + live check), check-regen-pending.mjs's own self-test, git-merge-regen.mjs --self-test — all pass; lint.yml's reference is prose-only.
  • node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands scripts/check-regen-pending.mjs .githooks/pre-commit → 18 commands, all run → --ran: 18 derived, 18 run, 0 NOT-MEASURED, 0 UNRUN.
  • pnpm check:ratchet-remedy-authority, pnpm check:declared-population-live, node scripts/check-self-test-wired.mjs, pnpm check:bash32-floor — all pass.
  • Narrowed lint (eslint --no-inline-config scripts/check-regen-pending.mjs) — clean.
  • git fetch origin main && git merge origin/main (clean, no conflicts) → self-test re-run on merged tree b5986fd2d — pass.

No third copy of either sentence repo-wide; no test pins the old text.

Changeset

scripts/** + .githooks/ — publishes nothing, so no changeset. skip-changeset label applied (REST), per the convention PR #14468 followed.

Generated by Claude Code


Generated by Claude Code

…js and .githooks/pre-commit
Both sibling copies of the false claim corrected in os-regen-merge.sh by
#14154 survived: the hook's refuse-stale message and the pre-commit header
still said this hook records the sanctioned landing sequence's step-3
commit as a deferral. It does not — step 1's merge auto-commits with no
hook run at all (git skips pre-commit for a merge it completes itself), so
the marker is untouched going into step 3, whose commit is an ordinary one
this hook refuses on purpose. That refusal is the designed collection
point, not a deferral.
The deferral mode (#8047) is real, but applies only to a merge commit
finished BY HAND with MERGE_HEAD present at commit time — a conflicted
merge an operator resolves and finishes with `git commit`. Both texts now
state that precisely, mirroring the reference wording already correct in
scripts/pm/os-regen-merge.sh:110-115.
Fixes#14470
Co-Authored-By: Claude Code <noreply@anthropic.com>
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 2, 2026
@baozhoutao
baozhoutao marked this pull request as ready for review September 2, 2026 11:28
@baozhoutao
baozhoutao added this pull request to the merge queueSep 2, 2026
Merged via the queue into main with commit e6fd6b2Sep 2, 2026
36 checks passed
@baozhoutao
baozhoutao deleted the claude/issue-14470-deferral-prose branch September 2, 2026 12:25
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/sskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants

@baozhoutao@claude