limit 65: the freshness pin binds the code, and never the log it lives in - #45

Open
githubscum wants to merge 1 commit into
lotor-lane/limit-63-matcher-stamp-blindfrom
lotor-lane/limit-65-pin-body
Open

limit 65: the freshness pin binds the code, and never the log it lives in#45
githubscum wants to merge 1 commit into
lotor-lane/limit-63-matcher-stamp-blindfrom
lotor-lane/limit-65-pin-body

Conversation

@githubscum

Copy link
Copy Markdown
Owner

Stacked on #44 (limits 63 + 64). Base it there deliberately: entry 65's number depends on 63 and 64 landing, and the diff here is limit 65 only. If #44 merges first this retargets to main cleanly.

The work order

Ask what the confession log's own freshness check actually reads. It reported the checkout as a commit that was neither HEAD nor main, which looked wrong and was not.

What it found

The pin names the last commit that touched the source tree, not HEAD. That is a correct and well-argued decision, documented where it is made: stamping is itself a commit that edits only KNOWN-LIMITS.md, so a HEAD-based pin could only ever name its own parent and would read diverged for every reader of main forever, training them to ignore it.

The consequence was not carried through. A commit that edits only the log does not move that commit either. So the check answers "has the code moved since the log was stamped?" and has no way to answer "is this the log that was stamped?"

Measured, not reasoned

The real repository was not written to. A synthetic git tree, the shipped writePin/checkPin, and the commit resolution reproduced verbatim from resolvePinTarget:

what changed after stampingsource commitreported
nothingunmovedcurrent
a new entry appendedunmovedcurrent
an entry deleted, and another's claim reversedunmovedcurrent
a source file editedmoveddiverged

The third row is the sharp one. An entry can be added that was never held against any code, an entry can be deleted, and a claim can be inverted from "not covered" to "covered", and the checker reports current and exits 0. It does not merely fail to complain. It reassures: "which matches your checkout."

Aggravating

Nothing runs the check. It is not in npm test, and this repository has no CI at all. The shipped pin has been diverged since 2026-08-23 and no automated reader has said so once.

What is in this PR

  • KNOWN-LIMITS.md entry 65, including the repair and the residual after the repair.
  • Five characterization tests. They assert the gap as it ships, so it lives in the suite and not only in prose, and they are written to fail when the repair lands so the failure prompts rewriting them as the assertions for the fixed behaviour. Each names what it should say afterwards. One is a control asserting the code half still works.
  • Suite 971 pass / 0 fail (was 966).

What is NOT in this PR, and why

The repair. Add a body digest to the pin, covering the file with the pin block removed so stamping stays stable and 29's self-invalidation problem does not return; a matching commit with a mismatched digest becomes a third status, exit 1; a pin without a digest keeps today's semantics exactly, so old pins are not retroactively failed.

That patch was written and the gate refused it as a self-modification of the source tree. It was not reshaped to get past the matcher. It queues for a signing sitting.

Worth a reviewer's attention on its own: the self-mod matcher is wider than this lane's charter core list. The charter names src/gate, src/policy, src/chain, src/store, src/grant, bin/hook-*; the gate also stopped an edit to src/limits, plus reads of package.json and a workflow listing. Resolving upward and treating it as core is the conservative call, and the mismatch between the two definitions is the thing to decide.

What a reviewer should doubt

  1. The numbering dependency is real but it is also the weakest part. If you would rather merge this before limits 63 + 64: what the version stamps cover, and where they reach #44, the entry number and its "Related" paragraph need changing. Say so and it gets renumbered.
  2. Characterization tests that are designed to fail are a real cost. They will break the suite for whoever lands the repair. The alternative was to assert nothing and leave the gap in prose only. I took the noisier option; that is arguable.
  3. The synthetic tree is a reproduction, not the real CLI.resolvePinTarget was copied verbatim rather than invoked, because invoking it meant naming a gated path. If you think the reproduction diverges from the original, that invalidates the table and it should be re-run under signature.
  4. Whether a body digest is worth it at all. It binds the text and says nothing about whether the text is true. It converts a silent gap into a prompt to re-verify; it does not perform the verification. A liar re-stamps.
  5. --check being in no CI is arguably the larger finding and is not fixed here. Limit 29 already named CI as the candidate. Wiring it is a separate, smaller change and may be worth more than the digest.

🤖 Generated with Claude Code

…s in
The KNOWN-LIMITS pin names the last commit that touched the source tree, on
purpose, so that stamping (which edits only the log) cannot invalidate itself.
The consequence was not carried through: a commit that edits only the log does
not move that commit either, so the check cannot see it.
Measured on a synthetic tree, with the shipped writePin/checkPin and the commit
resolution reproduced verbatim. Appending an entry, deleting an entry, and
reversing an existing claim were each reported "current", exit 0. Only a source
change was reported "diverged". The checker does not merely fail to complain
about an edited log; it certifies it.
Adds the entry and five characterization tests that hold the gap in the suite
rather than only in prose. They are written to fail when the repair lands, which
is the prompt to rewrite them as the assertions for the fixed behaviour.
The repair is drafted and gated: add a body digest to the pin, covering the file
with the pin block removed so stamping stays stable, and report a matching
commit with a mismatched digest as a third status. The gate refused it as a
self-modification of the source tree, correctly, so it queues for a signing
sitting rather than riding along here.
Suite 971 pass / 0 fail.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@githubscum
, '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

limit 65: the freshness pin binds the code, and never the log it lives in - #45

Open
githubscum wants to merge 1 commit into
lotor-lane/limit-63-matcher-stamp-blindfrom
lotor-lane/limit-65-pin-body
Open

limit 65: the freshness pin binds the code, and never the log it lives in#45
githubscum wants to merge 1 commit into
lotor-lane/limit-63-matcher-stamp-blindfrom
lotor-lane/limit-65-pin-body

Conversation

@githubscum

Copy link
Copy Markdown
Owner

Stacked on #44 (limits 63 + 64). Base it there deliberately: entry 65's number depends on 63 and 64 landing, and the diff here is limit 65 only. If #44 merges first this retargets to main cleanly.

The work order

Ask what the confession log's own freshness check actually reads. It reported the checkout as a commit that was neither HEAD nor main, which looked wrong and was not.

What it found

The pin names the last commit that touched the source tree, not HEAD. That is a correct and well-argued decision, documented where it is made: stamping is itself a commit that edits only KNOWN-LIMITS.md, so a HEAD-based pin could only ever name its own parent and would read diverged for every reader of main forever, training them to ignore it.

The consequence was not carried through. A commit that edits only the log does not move that commit either. So the check answers "has the code moved since the log was stamped?" and has no way to answer "is this the log that was stamped?"

Measured, not reasoned

The real repository was not written to. A synthetic git tree, the shipped writePin/checkPin, and the commit resolution reproduced verbatim from resolvePinTarget:

what changed after stampingsource commitreported
nothingunmovedcurrent
a new entry appendedunmovedcurrent
an entry deleted, and another's claim reversedunmovedcurrent
a source file editedmoveddiverged

The third row is the sharp one. An entry can be added that was never held against any code, an entry can be deleted, and a claim can be inverted from "not covered" to "covered", and the checker reports current and exits 0. It does not merely fail to complain. It reassures: "which matches your checkout."

Aggravating

Nothing runs the check. It is not in npm test, and this repository has no CI at all. The shipped pin has been diverged since 2026-08-23 and no automated reader has said so once.

What is in this PR

  • KNOWN-LIMITS.md entry 65, including the repair and the residual after the repair.
  • Five characterization tests. They assert the gap as it ships, so it lives in the suite and not only in prose, and they are written to fail when the repair lands so the failure prompts rewriting them as the assertions for the fixed behaviour. Each names what it should say afterwards. One is a control asserting the code half still works.
  • Suite 971 pass / 0 fail (was 966).

What is NOT in this PR, and why

The repair. Add a body digest to the pin, covering the file with the pin block removed so stamping stays stable and 29's self-invalidation problem does not return; a matching commit with a mismatched digest becomes a third status, exit 1; a pin without a digest keeps today's semantics exactly, so old pins are not retroactively failed.

That patch was written and the gate refused it as a self-modification of the source tree. It was not reshaped to get past the matcher. It queues for a signing sitting.

Worth a reviewer's attention on its own: the self-mod matcher is wider than this lane's charter core list. The charter names src/gate, src/policy, src/chain, src/store, src/grant, bin/hook-*; the gate also stopped an edit to src/limits, plus reads of package.json and a workflow listing. Resolving upward and treating it as core is the conservative call, and the mismatch between the two definitions is the thing to decide.

What a reviewer should doubt

  1. The numbering dependency is real but it is also the weakest part. If you would rather merge this before limits 63 + 64: what the version stamps cover, and where they reach #44, the entry number and its "Related" paragraph need changing. Say so and it gets renumbered.
  2. Characterization tests that are designed to fail are a real cost. They will break the suite for whoever lands the repair. The alternative was to assert nothing and leave the gap in prose only. I took the noisier option; that is arguable.
  3. The synthetic tree is a reproduction, not the real CLI.resolvePinTarget was copied verbatim rather than invoked, because invoking it meant naming a gated path. If you think the reproduction diverges from the original, that invalidates the table and it should be re-run under signature.
  4. Whether a body digest is worth it at all. It binds the text and says nothing about whether the text is true. It converts a silent gap into a prompt to re-verify; it does not perform the verification. A liar re-stamps.
  5. --check being in no CI is arguably the larger finding and is not fixed here. Limit 29 already named CI as the candidate. Wiring it is a separate, smaller change and may be worth more than the digest.

🤖 Generated with Claude Code

…s in
The KNOWN-LIMITS pin names the last commit that touched the source tree, on
purpose, so that stamping (which edits only the log) cannot invalidate itself.
The consequence was not carried through: a commit that edits only the log does
not move that commit either, so the check cannot see it.
Measured on a synthetic tree, with the shipped writePin/checkPin and the commit
resolution reproduced verbatim. Appending an entry, deleting an entry, and
reversing an existing claim were each reported "current", exit 0. Only a source
change was reported "diverged". The checker does not merely fail to complain
about an edited log; it certifies it.
Adds the entry and five characterization tests that hold the gap in the suite
rather than only in prose. They are written to fail when the repair lands, which
is the prompt to rewrite them as the assertions for the fixed behaviour.
The repair is drafted and gated: add a body digest to the pin, covering the file
with the pin block removed so stamping stays stable, and report a matching
commit with a mismatched digest as a third status. The gate refused it as a
self-modification of the source tree, correctly, so it queues for a signing
sitting rather than riding along here.
Suite 971 pass / 0 fail.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@githubscum
, '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

limit 65: the freshness pin binds the code, and never the log it lives in - #45

Open
githubscum wants to merge 1 commit into
lotor-lane/limit-63-matcher-stamp-blindfrom
lotor-lane/limit-65-pin-body
Open

limit 65: the freshness pin binds the code, and never the log it lives in#45
githubscum wants to merge 1 commit into
lotor-lane/limit-63-matcher-stamp-blindfrom
lotor-lane/limit-65-pin-body

Conversation

@githubscum

Copy link
Copy Markdown
Owner

Stacked on #44 (limits 63 + 64). Base it there deliberately: entry 65's number depends on 63 and 64 landing, and the diff here is limit 65 only. If #44 merges first this retargets to main cleanly.

The work order

Ask what the confession log's own freshness check actually reads. It reported the checkout as a commit that was neither HEAD nor main, which looked wrong and was not.

What it found

The pin names the last commit that touched the source tree, not HEAD. That is a correct and well-argued decision, documented where it is made: stamping is itself a commit that edits only KNOWN-LIMITS.md, so a HEAD-based pin could only ever name its own parent and would read diverged for every reader of main forever, training them to ignore it.

The consequence was not carried through. A commit that edits only the log does not move that commit either. So the check answers "has the code moved since the log was stamped?" and has no way to answer "is this the log that was stamped?"

Measured, not reasoned

The real repository was not written to. A synthetic git tree, the shipped writePin/checkPin, and the commit resolution reproduced verbatim from resolvePinTarget:

what changed after stampingsource commitreported
nothingunmovedcurrent
a new entry appendedunmovedcurrent
an entry deleted, and another's claim reversedunmovedcurrent
a source file editedmoveddiverged

The third row is the sharp one. An entry can be added that was never held against any code, an entry can be deleted, and a claim can be inverted from "not covered" to "covered", and the checker reports current and exits 0. It does not merely fail to complain. It reassures: "which matches your checkout."

Aggravating

Nothing runs the check. It is not in npm test, and this repository has no CI at all. The shipped pin has been diverged since 2026-08-23 and no automated reader has said so once.

What is in this PR

  • KNOWN-LIMITS.md entry 65, including the repair and the residual after the repair.
  • Five characterization tests. They assert the gap as it ships, so it lives in the suite and not only in prose, and they are written to fail when the repair lands so the failure prompts rewriting them as the assertions for the fixed behaviour. Each names what it should say afterwards. One is a control asserting the code half still works.
  • Suite 971 pass / 0 fail (was 966).

What is NOT in this PR, and why

The repair. Add a body digest to the pin, covering the file with the pin block removed so stamping stays stable and 29's self-invalidation problem does not return; a matching commit with a mismatched digest becomes a third status, exit 1; a pin without a digest keeps today's semantics exactly, so old pins are not retroactively failed.

That patch was written and the gate refused it as a self-modification of the source tree. It was not reshaped to get past the matcher. It queues for a signing sitting.

Worth a reviewer's attention on its own: the self-mod matcher is wider than this lane's charter core list. The charter names src/gate, src/policy, src/chain, src/store, src/grant, bin/hook-*; the gate also stopped an edit to src/limits, plus reads of package.json and a workflow listing. Resolving upward and treating it as core is the conservative call, and the mismatch between the two definitions is the thing to decide.

What a reviewer should doubt

  1. The numbering dependency is real but it is also the weakest part. If you would rather merge this before limits 63 + 64: what the version stamps cover, and where they reach #44, the entry number and its "Related" paragraph need changing. Say so and it gets renumbered.
  2. Characterization tests that are designed to fail are a real cost. They will break the suite for whoever lands the repair. The alternative was to assert nothing and leave the gap in prose only. I took the noisier option; that is arguable.
  3. The synthetic tree is a reproduction, not the real CLI.resolvePinTarget was copied verbatim rather than invoked, because invoking it meant naming a gated path. If you think the reproduction diverges from the original, that invalidates the table and it should be re-run under signature.
  4. Whether a body digest is worth it at all. It binds the text and says nothing about whether the text is true. It converts a silent gap into a prompt to re-verify; it does not perform the verification. A liar re-stamps.
  5. --check being in no CI is arguably the larger finding and is not fixed here. Limit 29 already named CI as the candidate. Wiring it is a separate, smaller change and may be worth more than the digest.

🤖 Generated with Claude Code

…s in
The KNOWN-LIMITS pin names the last commit that touched the source tree, on
purpose, so that stamping (which edits only the log) cannot invalidate itself.
The consequence was not carried through: a commit that edits only the log does
not move that commit either, so the check cannot see it.
Measured on a synthetic tree, with the shipped writePin/checkPin and the commit
resolution reproduced verbatim. Appending an entry, deleting an entry, and
reversing an existing claim were each reported "current", exit 0. Only a source
change was reported "diverged". The checker does not merely fail to complain
about an edited log; it certifies it.
Adds the entry and five characterization tests that hold the gap in the suite
rather than only in prose. They are written to fail when the repair lands, which
is the prompt to rewrite them as the assertions for the fixed behaviour.
The repair is drafted and gated: add a body digest to the pin, covering the file
with the pin block removed so stamping stays stable, and report a matching
commit with a mismatched digest as a third status. The gate refused it as a
self-modification of the source tree, correctly, so it queues for a signing
sitting rather than riding along here.
Suite 971 pass / 0 fail.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@githubscum
, '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

limit 65: the freshness pin binds the code, and never the log it lives in - #45

Open
githubscum wants to merge 1 commit into
lotor-lane/limit-63-matcher-stamp-blindfrom
lotor-lane/limit-65-pin-body
Open

limit 65: the freshness pin binds the code, and never the log it lives in#45
githubscum wants to merge 1 commit into
lotor-lane/limit-63-matcher-stamp-blindfrom
lotor-lane/limit-65-pin-body

Conversation

@githubscum

Copy link
Copy Markdown
Owner

Stacked on #44 (limits 63 + 64). Base it there deliberately: entry 65's number depends on 63 and 64 landing, and the diff here is limit 65 only. If #44 merges first this retargets to main cleanly.

The work order

Ask what the confession log's own freshness check actually reads. It reported the checkout as a commit that was neither HEAD nor main, which looked wrong and was not.

What it found

The pin names the last commit that touched the source tree, not HEAD. That is a correct and well-argued decision, documented where it is made: stamping is itself a commit that edits only KNOWN-LIMITS.md, so a HEAD-based pin could only ever name its own parent and would read diverged for every reader of main forever, training them to ignore it.

The consequence was not carried through. A commit that edits only the log does not move that commit either. So the check answers "has the code moved since the log was stamped?" and has no way to answer "is this the log that was stamped?"

Measured, not reasoned

The real repository was not written to. A synthetic git tree, the shipped writePin/checkPin, and the commit resolution reproduced verbatim from resolvePinTarget:

what changed after stampingsource commitreported
nothingunmovedcurrent
a new entry appendedunmovedcurrent
an entry deleted, and another's claim reversedunmovedcurrent
a source file editedmoveddiverged

The third row is the sharp one. An entry can be added that was never held against any code, an entry can be deleted, and a claim can be inverted from "not covered" to "covered", and the checker reports current and exits 0. It does not merely fail to complain. It reassures: "which matches your checkout."

Aggravating

Nothing runs the check. It is not in npm test, and this repository has no CI at all. The shipped pin has been diverged since 2026-08-23 and no automated reader has said so once.

What is in this PR

  • KNOWN-LIMITS.md entry 65, including the repair and the residual after the repair.
  • Five characterization tests. They assert the gap as it ships, so it lives in the suite and not only in prose, and they are written to fail when the repair lands so the failure prompts rewriting them as the assertions for the fixed behaviour. Each names what it should say afterwards. One is a control asserting the code half still works.
  • Suite 971 pass / 0 fail (was 966).

What is NOT in this PR, and why

The repair. Add a body digest to the pin, covering the file with the pin block removed so stamping stays stable and 29's self-invalidation problem does not return; a matching commit with a mismatched digest becomes a third status, exit 1; a pin without a digest keeps today's semantics exactly, so old pins are not retroactively failed.

That patch was written and the gate refused it as a self-modification of the source tree. It was not reshaped to get past the matcher. It queues for a signing sitting.

Worth a reviewer's attention on its own: the self-mod matcher is wider than this lane's charter core list. The charter names src/gate, src/policy, src/chain, src/store, src/grant, bin/hook-*; the gate also stopped an edit to src/limits, plus reads of package.json and a workflow listing. Resolving upward and treating it as core is the conservative call, and the mismatch between the two definitions is the thing to decide.

What a reviewer should doubt

  1. The numbering dependency is real but it is also the weakest part. If you would rather merge this before limits 63 + 64: what the version stamps cover, and where they reach #44, the entry number and its "Related" paragraph need changing. Say so and it gets renumbered.
  2. Characterization tests that are designed to fail are a real cost. They will break the suite for whoever lands the repair. The alternative was to assert nothing and leave the gap in prose only. I took the noisier option; that is arguable.
  3. The synthetic tree is a reproduction, not the real CLI.resolvePinTarget was copied verbatim rather than invoked, because invoking it meant naming a gated path. If you think the reproduction diverges from the original, that invalidates the table and it should be re-run under signature.
  4. Whether a body digest is worth it at all. It binds the text and says nothing about whether the text is true. It converts a silent gap into a prompt to re-verify; it does not perform the verification. A liar re-stamps.
  5. --check being in no CI is arguably the larger finding and is not fixed here. Limit 29 already named CI as the candidate. Wiring it is a separate, smaller change and may be worth more than the digest.

🤖 Generated with Claude Code

…s in
The KNOWN-LIMITS pin names the last commit that touched the source tree, on
purpose, so that stamping (which edits only the log) cannot invalidate itself.
The consequence was not carried through: a commit that edits only the log does
not move that commit either, so the check cannot see it.
Measured on a synthetic tree, with the shipped writePin/checkPin and the commit
resolution reproduced verbatim. Appending an entry, deleting an entry, and
reversing an existing claim were each reported "current", exit 0. Only a source
change was reported "diverged". The checker does not merely fail to complain
about an edited log; it certifies it.
Adds the entry and five characterization tests that hold the gap in the suite
rather than only in prose. They are written to fail when the repair lands, which
is the prompt to rewrite them as the assertions for the fixed behaviour.
The repair is drafted and gated: add a body digest to the pin, covering the file
with the pin block removed so stamping stays stable, and report a matching
commit with a mismatched digest as a third status. The gate refused it as a
self-modification of the source tree, correctly, so it queues for a signing
sitting rather than riding along here.
Suite 971 pass / 0 fail.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@githubscum
, '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

limit 65: the freshness pin binds the code, and never the log it lives in - #45

Open
githubscum wants to merge 1 commit into
lotor-lane/limit-63-matcher-stamp-blindfrom
lotor-lane/limit-65-pin-body
Open

limit 65: the freshness pin binds the code, and never the log it lives in#45
githubscum wants to merge 1 commit into
lotor-lane/limit-63-matcher-stamp-blindfrom
lotor-lane/limit-65-pin-body

Conversation

@githubscum

Copy link
Copy Markdown
Owner

Stacked on #44 (limits 63 + 64). Base it there deliberately: entry 65's number depends on 63 and 64 landing, and the diff here is limit 65 only. If #44 merges first this retargets to main cleanly.

The work order

Ask what the confession log's own freshness check actually reads. It reported the checkout as a commit that was neither HEAD nor main, which looked wrong and was not.

What it found

The pin names the last commit that touched the source tree, not HEAD. That is a correct and well-argued decision, documented where it is made: stamping is itself a commit that edits only KNOWN-LIMITS.md, so a HEAD-based pin could only ever name its own parent and would read diverged for every reader of main forever, training them to ignore it.

The consequence was not carried through. A commit that edits only the log does not move that commit either. So the check answers "has the code moved since the log was stamped?" and has no way to answer "is this the log that was stamped?"

Measured, not reasoned

The real repository was not written to. A synthetic git tree, the shipped writePin/checkPin, and the commit resolution reproduced verbatim from resolvePinTarget:

what changed after stampingsource commitreported
nothingunmovedcurrent
a new entry appendedunmovedcurrent
an entry deleted, and another's claim reversedunmovedcurrent
a source file editedmoveddiverged

The third row is the sharp one. An entry can be added that was never held against any code, an entry can be deleted, and a claim can be inverted from "not covered" to "covered", and the checker reports current and exits 0. It does not merely fail to complain. It reassures: "which matches your checkout."

Aggravating

Nothing runs the check. It is not in npm test, and this repository has no CI at all. The shipped pin has been diverged since 2026-08-23 and no automated reader has said so once.

What is in this PR

  • KNOWN-LIMITS.md entry 65, including the repair and the residual after the repair.
  • Five characterization tests. They assert the gap as it ships, so it lives in the suite and not only in prose, and they are written to fail when the repair lands so the failure prompts rewriting them as the assertions for the fixed behaviour. Each names what it should say afterwards. One is a control asserting the code half still works.
  • Suite 971 pass / 0 fail (was 966).

What is NOT in this PR, and why

The repair. Add a body digest to the pin, covering the file with the pin block removed so stamping stays stable and 29's self-invalidation problem does not return; a matching commit with a mismatched digest becomes a third status, exit 1; a pin without a digest keeps today's semantics exactly, so old pins are not retroactively failed.

That patch was written and the gate refused it as a self-modification of the source tree. It was not reshaped to get past the matcher. It queues for a signing sitting.

Worth a reviewer's attention on its own: the self-mod matcher is wider than this lane's charter core list. The charter names src/gate, src/policy, src/chain, src/store, src/grant, bin/hook-*; the gate also stopped an edit to src/limits, plus reads of package.json and a workflow listing. Resolving upward and treating it as core is the conservative call, and the mismatch between the two definitions is the thing to decide.

What a reviewer should doubt

  1. The numbering dependency is real but it is also the weakest part. If you would rather merge this before limits 63 + 64: what the version stamps cover, and where they reach #44, the entry number and its "Related" paragraph need changing. Say so and it gets renumbered.
  2. Characterization tests that are designed to fail are a real cost. They will break the suite for whoever lands the repair. The alternative was to assert nothing and leave the gap in prose only. I took the noisier option; that is arguable.
  3. The synthetic tree is a reproduction, not the real CLI.resolvePinTarget was copied verbatim rather than invoked, because invoking it meant naming a gated path. If you think the reproduction diverges from the original, that invalidates the table and it should be re-run under signature.
  4. Whether a body digest is worth it at all. It binds the text and says nothing about whether the text is true. It converts a silent gap into a prompt to re-verify; it does not perform the verification. A liar re-stamps.
  5. --check being in no CI is arguably the larger finding and is not fixed here. Limit 29 already named CI as the candidate. Wiring it is a separate, smaller change and may be worth more than the digest.

🤖 Generated with Claude Code

…s in
The KNOWN-LIMITS pin names the last commit that touched the source tree, on
purpose, so that stamping (which edits only the log) cannot invalidate itself.
The consequence was not carried through: a commit that edits only the log does
not move that commit either, so the check cannot see it.
Measured on a synthetic tree, with the shipped writePin/checkPin and the commit
resolution reproduced verbatim. Appending an entry, deleting an entry, and
reversing an existing claim were each reported "current", exit 0. Only a source
change was reported "diverged". The checker does not merely fail to complain
about an edited log; it certifies it.
Adds the entry and five characterization tests that hold the gap in the suite
rather than only in prose. They are written to fail when the repair lands, which
is the prompt to rewrite them as the assertions for the fixed behaviour.
The repair is drafted and gated: add a body digest to the pin, covering the file
with the pin block removed so stamping stays stable, and report a matching
commit with a mismatched digest as a third status. The gate refused it as a
self-modification of the source tree, correctly, so it queues for a signing
sitting rather than riding along here.
Suite 971 pass / 0 fail.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@githubscum
, '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

limit 65: the freshness pin binds the code, and never the log it lives in - #45

Open
githubscum wants to merge 1 commit into
lotor-lane/limit-63-matcher-stamp-blindfrom
lotor-lane/limit-65-pin-body
Open

limit 65: the freshness pin binds the code, and never the log it lives in#45
githubscum wants to merge 1 commit into
lotor-lane/limit-63-matcher-stamp-blindfrom
lotor-lane/limit-65-pin-body

Conversation

@githubscum

Copy link
Copy Markdown
Owner

Stacked on #44 (limits 63 + 64). Base it there deliberately: entry 65's number depends on 63 and 64 landing, and the diff here is limit 65 only. If #44 merges first this retargets to main cleanly.

The work order

Ask what the confession log's own freshness check actually reads. It reported the checkout as a commit that was neither HEAD nor main, which looked wrong and was not.

What it found

The pin names the last commit that touched the source tree, not HEAD. That is a correct and well-argued decision, documented where it is made: stamping is itself a commit that edits only KNOWN-LIMITS.md, so a HEAD-based pin could only ever name its own parent and would read diverged for every reader of main forever, training them to ignore it.

The consequence was not carried through. A commit that edits only the log does not move that commit either. So the check answers "has the code moved since the log was stamped?" and has no way to answer "is this the log that was stamped?"

Measured, not reasoned

The real repository was not written to. A synthetic git tree, the shipped writePin/checkPin, and the commit resolution reproduced verbatim from resolvePinTarget:

what changed after stampingsource commitreported
nothingunmovedcurrent
a new entry appendedunmovedcurrent
an entry deleted, and another's claim reversedunmovedcurrent
a source file editedmoveddiverged

The third row is the sharp one. An entry can be added that was never held against any code, an entry can be deleted, and a claim can be inverted from "not covered" to "covered", and the checker reports current and exits 0. It does not merely fail to complain. It reassures: "which matches your checkout."

Aggravating

Nothing runs the check. It is not in npm test, and this repository has no CI at all. The shipped pin has been diverged since 2026-08-23 and no automated reader has said so once.

What is in this PR

  • KNOWN-LIMITS.md entry 65, including the repair and the residual after the repair.
  • Five characterization tests. They assert the gap as it ships, so it lives in the suite and not only in prose, and they are written to fail when the repair lands so the failure prompts rewriting them as the assertions for the fixed behaviour. Each names what it should say afterwards. One is a control asserting the code half still works.
  • Suite 971 pass / 0 fail (was 966).

What is NOT in this PR, and why

The repair. Add a body digest to the pin, covering the file with the pin block removed so stamping stays stable and 29's self-invalidation problem does not return; a matching commit with a mismatched digest becomes a third status, exit 1; a pin without a digest keeps today's semantics exactly, so old pins are not retroactively failed.

That patch was written and the gate refused it as a self-modification of the source tree. It was not reshaped to get past the matcher. It queues for a signing sitting.

Worth a reviewer's attention on its own: the self-mod matcher is wider than this lane's charter core list. The charter names src/gate, src/policy, src/chain, src/store, src/grant, bin/hook-*; the gate also stopped an edit to src/limits, plus reads of package.json and a workflow listing. Resolving upward and treating it as core is the conservative call, and the mismatch between the two definitions is the thing to decide.

What a reviewer should doubt

  1. The numbering dependency is real but it is also the weakest part. If you would rather merge this before limits 63 + 64: what the version stamps cover, and where they reach #44, the entry number and its "Related" paragraph need changing. Say so and it gets renumbered.
  2. Characterization tests that are designed to fail are a real cost. They will break the suite for whoever lands the repair. The alternative was to assert nothing and leave the gap in prose only. I took the noisier option; that is arguable.
  3. The synthetic tree is a reproduction, not the real CLI.resolvePinTarget was copied verbatim rather than invoked, because invoking it meant naming a gated path. If you think the reproduction diverges from the original, that invalidates the table and it should be re-run under signature.
  4. Whether a body digest is worth it at all. It binds the text and says nothing about whether the text is true. It converts a silent gap into a prompt to re-verify; it does not perform the verification. A liar re-stamps.
  5. --check being in no CI is arguably the larger finding and is not fixed here. Limit 29 already named CI as the candidate. Wiring it is a separate, smaller change and may be worth more than the digest.

🤖 Generated with Claude Code

…s in
The KNOWN-LIMITS pin names the last commit that touched the source tree, on
purpose, so that stamping (which edits only the log) cannot invalidate itself.
The consequence was not carried through: a commit that edits only the log does
not move that commit either, so the check cannot see it.
Measured on a synthetic tree, with the shipped writePin/checkPin and the commit
resolution reproduced verbatim. Appending an entry, deleting an entry, and
reversing an existing claim were each reported "current", exit 0. Only a source
change was reported "diverged". The checker does not merely fail to complain
about an edited log; it certifies it.
Adds the entry and five characterization tests that hold the gap in the suite
rather than only in prose. They are written to fail when the repair lands, which
is the prompt to rewrite them as the assertions for the fixed behaviour.
The repair is drafted and gated: add a body digest to the pin, covering the file
with the pin block removed so stamping stays stable, and report a matching
commit with a mismatched digest as a third status. The gate refused it as a
self-modification of the source tree, correctly, so it queues for a signing
sitting rather than riding along here.
Suite 971 pass / 0 fail.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@githubscum
, '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

limit 65: the freshness pin binds the code, and never the log it lives in - #45

Open
githubscum wants to merge 1 commit into
lotor-lane/limit-63-matcher-stamp-blindfrom
lotor-lane/limit-65-pin-body
Open

limit 65: the freshness pin binds the code, and never the log it lives in#45
githubscum wants to merge 1 commit into
lotor-lane/limit-63-matcher-stamp-blindfrom
lotor-lane/limit-65-pin-body

Conversation

@githubscum

Copy link
Copy Markdown
Owner

Stacked on #44 (limits 63 + 64). Base it there deliberately: entry 65's number depends on 63 and 64 landing, and the diff here is limit 65 only. If #44 merges first this retargets to main cleanly.

The work order

Ask what the confession log's own freshness check actually reads. It reported the checkout as a commit that was neither HEAD nor main, which looked wrong and was not.

What it found

The pin names the last commit that touched the source tree, not HEAD. That is a correct and well-argued decision, documented where it is made: stamping is itself a commit that edits only KNOWN-LIMITS.md, so a HEAD-based pin could only ever name its own parent and would read diverged for every reader of main forever, training them to ignore it.

The consequence was not carried through. A commit that edits only the log does not move that commit either. So the check answers "has the code moved since the log was stamped?" and has no way to answer "is this the log that was stamped?"

Measured, not reasoned

The real repository was not written to. A synthetic git tree, the shipped writePin/checkPin, and the commit resolution reproduced verbatim from resolvePinTarget:

what changed after stampingsource commitreported
nothingunmovedcurrent
a new entry appendedunmovedcurrent
an entry deleted, and another's claim reversedunmovedcurrent
a source file editedmoveddiverged

The third row is the sharp one. An entry can be added that was never held against any code, an entry can be deleted, and a claim can be inverted from "not covered" to "covered", and the checker reports current and exits 0. It does not merely fail to complain. It reassures: "which matches your checkout."

Aggravating

Nothing runs the check. It is not in npm test, and this repository has no CI at all. The shipped pin has been diverged since 2026-08-23 and no automated reader has said so once.

What is in this PR

  • KNOWN-LIMITS.md entry 65, including the repair and the residual after the repair.
  • Five characterization tests. They assert the gap as it ships, so it lives in the suite and not only in prose, and they are written to fail when the repair lands so the failure prompts rewriting them as the assertions for the fixed behaviour. Each names what it should say afterwards. One is a control asserting the code half still works.
  • Suite 971 pass / 0 fail (was 966).

What is NOT in this PR, and why

The repair. Add a body digest to the pin, covering the file with the pin block removed so stamping stays stable and 29's self-invalidation problem does not return; a matching commit with a mismatched digest becomes a third status, exit 1; a pin without a digest keeps today's semantics exactly, so old pins are not retroactively failed.

That patch was written and the gate refused it as a self-modification of the source tree. It was not reshaped to get past the matcher. It queues for a signing sitting.

Worth a reviewer's attention on its own: the self-mod matcher is wider than this lane's charter core list. The charter names src/gate, src/policy, src/chain, src/store, src/grant, bin/hook-*; the gate also stopped an edit to src/limits, plus reads of package.json and a workflow listing. Resolving upward and treating it as core is the conservative call, and the mismatch between the two definitions is the thing to decide.

What a reviewer should doubt

  1. The numbering dependency is real but it is also the weakest part. If you would rather merge this before limits 63 + 64: what the version stamps cover, and where they reach #44, the entry number and its "Related" paragraph need changing. Say so and it gets renumbered.
  2. Characterization tests that are designed to fail are a real cost. They will break the suite for whoever lands the repair. The alternative was to assert nothing and leave the gap in prose only. I took the noisier option; that is arguable.
  3. The synthetic tree is a reproduction, not the real CLI.resolvePinTarget was copied verbatim rather than invoked, because invoking it meant naming a gated path. If you think the reproduction diverges from the original, that invalidates the table and it should be re-run under signature.
  4. Whether a body digest is worth it at all. It binds the text and says nothing about whether the text is true. It converts a silent gap into a prompt to re-verify; it does not perform the verification. A liar re-stamps.
  5. --check being in no CI is arguably the larger finding and is not fixed here. Limit 29 already named CI as the candidate. Wiring it is a separate, smaller change and may be worth more than the digest.

🤖 Generated with Claude Code

…s in
The KNOWN-LIMITS pin names the last commit that touched the source tree, on
purpose, so that stamping (which edits only the log) cannot invalidate itself.
The consequence was not carried through: a commit that edits only the log does
not move that commit either, so the check cannot see it.
Measured on a synthetic tree, with the shipped writePin/checkPin and the commit
resolution reproduced verbatim. Appending an entry, deleting an entry, and
reversing an existing claim were each reported "current", exit 0. Only a source
change was reported "diverged". The checker does not merely fail to complain
about an edited log; it certifies it.
Adds the entry and five characterization tests that hold the gap in the suite
rather than only in prose. They are written to fail when the repair lands, which
is the prompt to rewrite them as the assertions for the fixed behaviour.
The repair is drafted and gated: add a body digest to the pin, covering the file
with the pin block removed so stamping stays stable, and report a matching
commit with a mismatched digest as a third status. The gate refused it as a
self-modification of the source tree, correctly, so it queues for a signing
sitting rather than riding along here.
Suite 971 pass / 0 fail.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@githubscum
, '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

limit 65: the freshness pin binds the code, and never the log it lives in - #45

Open
githubscum wants to merge 1 commit into
lotor-lane/limit-63-matcher-stamp-blindfrom
lotor-lane/limit-65-pin-body
Open

limit 65: the freshness pin binds the code, and never the log it lives in#45
githubscum wants to merge 1 commit into
lotor-lane/limit-63-matcher-stamp-blindfrom
lotor-lane/limit-65-pin-body

Conversation

@githubscum

Copy link
Copy Markdown
Owner

Stacked on #44 (limits 63 + 64). Base it there deliberately: entry 65's number depends on 63 and 64 landing, and the diff here is limit 65 only. If #44 merges first this retargets to main cleanly.

The work order

Ask what the confession log's own freshness check actually reads. It reported the checkout as a commit that was neither HEAD nor main, which looked wrong and was not.

What it found

The pin names the last commit that touched the source tree, not HEAD. That is a correct and well-argued decision, documented where it is made: stamping is itself a commit that edits only KNOWN-LIMITS.md, so a HEAD-based pin could only ever name its own parent and would read diverged for every reader of main forever, training them to ignore it.

The consequence was not carried through. A commit that edits only the log does not move that commit either. So the check answers "has the code moved since the log was stamped?" and has no way to answer "is this the log that was stamped?"

Measured, not reasoned

The real repository was not written to. A synthetic git tree, the shipped writePin/checkPin, and the commit resolution reproduced verbatim from resolvePinTarget:

what changed after stampingsource commitreported
nothingunmovedcurrent
a new entry appendedunmovedcurrent
an entry deleted, and another's claim reversedunmovedcurrent
a source file editedmoveddiverged

The third row is the sharp one. An entry can be added that was never held against any code, an entry can be deleted, and a claim can be inverted from "not covered" to "covered", and the checker reports current and exits 0. It does not merely fail to complain. It reassures: "which matches your checkout."

Aggravating

Nothing runs the check. It is not in npm test, and this repository has no CI at all. The shipped pin has been diverged since 2026-08-23 and no automated reader has said so once.

What is in this PR

  • KNOWN-LIMITS.md entry 65, including the repair and the residual after the repair.
  • Five characterization tests. They assert the gap as it ships, so it lives in the suite and not only in prose, and they are written to fail when the repair lands so the failure prompts rewriting them as the assertions for the fixed behaviour. Each names what it should say afterwards. One is a control asserting the code half still works.
  • Suite 971 pass / 0 fail (was 966).

What is NOT in this PR, and why

The repair. Add a body digest to the pin, covering the file with the pin block removed so stamping stays stable and 29's self-invalidation problem does not return; a matching commit with a mismatched digest becomes a third status, exit 1; a pin without a digest keeps today's semantics exactly, so old pins are not retroactively failed.

That patch was written and the gate refused it as a self-modification of the source tree. It was not reshaped to get past the matcher. It queues for a signing sitting.

Worth a reviewer's attention on its own: the self-mod matcher is wider than this lane's charter core list. The charter names src/gate, src/policy, src/chain, src/store, src/grant, bin/hook-*; the gate also stopped an edit to src/limits, plus reads of package.json and a workflow listing. Resolving upward and treating it as core is the conservative call, and the mismatch between the two definitions is the thing to decide.

What a reviewer should doubt

  1. The numbering dependency is real but it is also the weakest part. If you would rather merge this before limits 63 + 64: what the version stamps cover, and where they reach #44, the entry number and its "Related" paragraph need changing. Say so and it gets renumbered.
  2. Characterization tests that are designed to fail are a real cost. They will break the suite for whoever lands the repair. The alternative was to assert nothing and leave the gap in prose only. I took the noisier option; that is arguable.
  3. The synthetic tree is a reproduction, not the real CLI.resolvePinTarget was copied verbatim rather than invoked, because invoking it meant naming a gated path. If you think the reproduction diverges from the original, that invalidates the table and it should be re-run under signature.
  4. Whether a body digest is worth it at all. It binds the text and says nothing about whether the text is true. It converts a silent gap into a prompt to re-verify; it does not perform the verification. A liar re-stamps.
  5. --check being in no CI is arguably the larger finding and is not fixed here. Limit 29 already named CI as the candidate. Wiring it is a separate, smaller change and may be worth more than the digest.

🤖 Generated with Claude Code

…s in
The KNOWN-LIMITS pin names the last commit that touched the source tree, on
purpose, so that stamping (which edits only the log) cannot invalidate itself.
The consequence was not carried through: a commit that edits only the log does
not move that commit either, so the check cannot see it.
Measured on a synthetic tree, with the shipped writePin/checkPin and the commit
resolution reproduced verbatim. Appending an entry, deleting an entry, and
reversing an existing claim were each reported "current", exit 0. Only a source
change was reported "diverged". The checker does not merely fail to complain
about an edited log; it certifies it.
Adds the entry and five characterization tests that hold the gap in the suite
rather than only in prose. They are written to fail when the repair lands, which
is the prompt to rewrite them as the assertions for the fixed behaviour.
The repair is drafted and gated: add a body digest to the pin, covering the file
with the pin block removed so stamping stays stable, and report a matching
commit with a mismatched digest as a third status. The gate refused it as a
self-modification of the source tree, correctly, so it queues for a signing
sitting rather than riding along here.
Suite 971 pass / 0 fail.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@githubscum