Commit the formatting, and stop the release from dirtying its own tree - #192

Merged
brentrager merged 2 commits into
mainfrom
fix/format-drift
Aug 20, 2026
Merged

Commit the formatting, and stop the release from dirtying its own tree#192
brentrager merged 2 commits into
mainfrom
fix/format-drift

Conversation

@brentrager

Copy link
Copy Markdown
Contributor

What broke

Dropping cargo publish --allow-dirty (#186) surfaced what the flag had been hiding. The 4.5.2 release published to npm and PyPI, then:

error: 1 files in the working directory contain changes that were not yet committed into git:
rust/logger/README.md
to proceed despite this and include the uncommitted changes, pass the `--allow-dirty` flag

crates.io, the Go tag, and NuGet were all skipped.

Where the dirt comes from

release.yml's own Format step. It runs pnpm format, which rewrites files and then never commits them — so cargo publish, a few steps later, is looking at a dirty tree. --allow-dirty existed to shrug that off, which means every crate published from this repo silently carried uncommitted reformatting.

And main really is format-drifted, across seven files:

filedrift
.claude/settings.json4-space indent vs oxfmt's 2
README.md94 lines
CHANGELOG.md8 lines
package.jsondevDependencies unsorted, peerDependencies out of position
python/tests/test_otel_correlation.pyruff
src/Logger.otel.spec.tsoxfmt
rust/logger/README.md*errors*_errors_

Nothing was checking. PR checks run oxlint but never a formatter check, and pnpm format:check did not exist — despite release.yml having had a Format step the whole time.

Fix

  1. Commit the formatting.pnpm format is now a no-op on main.
  2. Add format:checkoxfmt --check + ruff format --check + cargo fmt --check + gofmt -l — and run it in PR checks so this cannot drift again.
  3. release.yml's FormatFormat check. Check, never rewrite. A release pipeline that mutates the tree and discards the result is precisely what made --allow-dirty look necessary.

The part that would have bitten again next release

changeset version writes CHANGELOG.md and package.json, and oxfmt wants both formatted differently from what changesets emits. Without handling that, the very next release PR lands unformatted, its format:check goes red, and cargo publish --locked breaks all over again. So the version lifecycle now ends with oxfmt --write CHANGELOG.md package.json, inside the same command whose output changesets/action commits:

"version": "changeset version && node scripts/sync-versions.mjs && oxfmt --write CHANGELOG.md package.json"

Verification

  • pnpm format:check → exit 0 on this branch.
  • Hand-broke it twice — trailing whitespace in rust/logger/README.md, and mangled import spacing in src/Logger.otel.spec.ts — and confirmed exit 1 both times, then green again after pnpm format.
  • node scripts/check-versions.mjs → OK at 4.5.2; vitest 89 passing; go test ./... ok.

After this merges

The 4.5.2 release needs finishing: npm and PyPI have it, crates.io / the Go tag / NuGet do not. Merging this makes the tree clean, and re-running the Release workflow will publish the remainder.

🤖 Generated with Claude Code

https://claude.ai/code/session_0152bbE1veqfG1SVJdyLCBxC

@changeset-bot

changeset-botBot commented Aug 20, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: bccefed

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
NameType
@smooai/loggerPatch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

brentragerand others added 2 commits August 20, 2026 14:51
Dropping `cargo publish --allow-dirty` (#186) surfaced what the flag had been
hiding for who knows how long:
error: 1 files in the working directory contain changes that were not yet
committed into git:
rust/logger/README.md
The dirt comes from release.yml's own `Format` step. It runs `pnpm format`,
which REWRITES files and then never commits them — so `cargo publish` a few
steps later stares at a dirty tree. `--allow-dirty` existed to shrug that off,
which meant every published crate silently carried uncommitted reformatting.
main is format-drifted across seven files: .claude/settings.json (4-space vs
oxfmt's 2), README.md (94 lines), CHANGELOG.md, package.json (devDependencies
unsorted, peerDependencies out of position), a Python test, a TS spec, and
rust/logger/README.md. Nothing checked: PR checks run oxlint but never a
formatter check, and `pnpm format:check` did not exist.
Three changes:
1. Commit the formatting. `pnpm format` is now a no-op on main.
2. Add `format:check` (oxfmt + ruff + cargo fmt + gofmt) and run it in PR
checks, so this cannot drift again. Verified red by hand-breaking both a
markdown file and a TS file.
3. release.yml's `Format` step becomes `Format check` — check, never rewrite. A
release pipeline that mutates the tree and discards the result is exactly the
thing that made `--allow-dirty` look necessary.
Also: `changeset version` writes CHANGELOG.md and package.json, and oxfmt wants
both formatted differently, so the version lifecycle now ends with
`oxfmt --write CHANGELOG.md package.json`. Without it the very next release PR
would land unformatted and break `cargo publish --locked` all over again.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0152bbE1veqfG1SVJdyLCBxC
Needed for its own sake (this changes package.json scripts) and to unstick the
release: crates.io, NuGet and the Go tag stalled at 4.5.0 while npm and PyPI
reached 4.5.2, and the downstream publish steps only fire when changesets
reports it published something — which needs a version bump.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0152bbE1veqfG1SVJdyLCBxC
@brentrager
brentrager merged commit be2b735 into mainAug 20, 2026
1 check passed
@brentrager
brentrager deleted the fix/format-drift branch August 20, 2026 18:54
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

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

Commit the formatting, and stop the release from dirtying its own tree - #192

Merged
brentrager merged 2 commits into
mainfrom
fix/format-drift
Aug 20, 2026
Merged

Commit the formatting, and stop the release from dirtying its own tree#192
brentrager merged 2 commits into
mainfrom
fix/format-drift

Conversation

@brentrager

Copy link
Copy Markdown
Contributor

What broke

Dropping cargo publish --allow-dirty (#186) surfaced what the flag had been hiding. The 4.5.2 release published to npm and PyPI, then:

error: 1 files in the working directory contain changes that were not yet committed into git:
rust/logger/README.md
to proceed despite this and include the uncommitted changes, pass the `--allow-dirty` flag

crates.io, the Go tag, and NuGet were all skipped.

Where the dirt comes from

release.yml's own Format step. It runs pnpm format, which rewrites files and then never commits them — so cargo publish, a few steps later, is looking at a dirty tree. --allow-dirty existed to shrug that off, which means every crate published from this repo silently carried uncommitted reformatting.

And main really is format-drifted, across seven files:

filedrift
.claude/settings.json4-space indent vs oxfmt's 2
README.md94 lines
CHANGELOG.md8 lines
package.jsondevDependencies unsorted, peerDependencies out of position
python/tests/test_otel_correlation.pyruff
src/Logger.otel.spec.tsoxfmt
rust/logger/README.md*errors*_errors_

Nothing was checking. PR checks run oxlint but never a formatter check, and pnpm format:check did not exist — despite release.yml having had a Format step the whole time.

Fix

  1. Commit the formatting.pnpm format is now a no-op on main.
  2. Add format:checkoxfmt --check + ruff format --check + cargo fmt --check + gofmt -l — and run it in PR checks so this cannot drift again.
  3. release.yml's FormatFormat check. Check, never rewrite. A release pipeline that mutates the tree and discards the result is precisely what made --allow-dirty look necessary.

The part that would have bitten again next release

changeset version writes CHANGELOG.md and package.json, and oxfmt wants both formatted differently from what changesets emits. Without handling that, the very next release PR lands unformatted, its format:check goes red, and cargo publish --locked breaks all over again. So the version lifecycle now ends with oxfmt --write CHANGELOG.md package.json, inside the same command whose output changesets/action commits:

"version": "changeset version && node scripts/sync-versions.mjs && oxfmt --write CHANGELOG.md package.json"

Verification

  • pnpm format:check → exit 0 on this branch.
  • Hand-broke it twice — trailing whitespace in rust/logger/README.md, and mangled import spacing in src/Logger.otel.spec.ts — and confirmed exit 1 both times, then green again after pnpm format.
  • node scripts/check-versions.mjs → OK at 4.5.2; vitest 89 passing; go test ./... ok.

After this merges

The 4.5.2 release needs finishing: npm and PyPI have it, crates.io / the Go tag / NuGet do not. Merging this makes the tree clean, and re-running the Release workflow will publish the remainder.

🤖 Generated with Claude Code

https://claude.ai/code/session_0152bbE1veqfG1SVJdyLCBxC

@changeset-bot

changeset-botBot commented Aug 20, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: bccefed

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
NameType
@smooai/loggerPatch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

brentragerand others added 2 commits August 20, 2026 14:51
Dropping `cargo publish --allow-dirty` (#186) surfaced what the flag had been
hiding for who knows how long:
error: 1 files in the working directory contain changes that were not yet
committed into git:
rust/logger/README.md
The dirt comes from release.yml's own `Format` step. It runs `pnpm format`,
which REWRITES files and then never commits them — so `cargo publish` a few
steps later stares at a dirty tree. `--allow-dirty` existed to shrug that off,
which meant every published crate silently carried uncommitted reformatting.
main is format-drifted across seven files: .claude/settings.json (4-space vs
oxfmt's 2), README.md (94 lines), CHANGELOG.md, package.json (devDependencies
unsorted, peerDependencies out of position), a Python test, a TS spec, and
rust/logger/README.md. Nothing checked: PR checks run oxlint but never a
formatter check, and `pnpm format:check` did not exist.
Three changes:
1. Commit the formatting. `pnpm format` is now a no-op on main.
2. Add `format:check` (oxfmt + ruff + cargo fmt + gofmt) and run it in PR
checks, so this cannot drift again. Verified red by hand-breaking both a
markdown file and a TS file.
3. release.yml's `Format` step becomes `Format check` — check, never rewrite. A
release pipeline that mutates the tree and discards the result is exactly the
thing that made `--allow-dirty` look necessary.
Also: `changeset version` writes CHANGELOG.md and package.json, and oxfmt wants
both formatted differently, so the version lifecycle now ends with
`oxfmt --write CHANGELOG.md package.json`. Without it the very next release PR
would land unformatted and break `cargo publish --locked` all over again.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0152bbE1veqfG1SVJdyLCBxC
Needed for its own sake (this changes package.json scripts) and to unstick the
release: crates.io, NuGet and the Go tag stalled at 4.5.0 while npm and PyPI
reached 4.5.2, and the downstream publish steps only fire when changesets
reports it published something — which needs a version bump.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0152bbE1veqfG1SVJdyLCBxC
@brentrager
brentrager merged commit be2b735 into mainAug 20, 2026
1 check passed
@brentrager
brentrager deleted the fix/format-drift branch August 20, 2026 18:54
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

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

Commit the formatting, and stop the release from dirtying its own tree - #192

Merged
brentrager merged 2 commits into
mainfrom
fix/format-drift
Aug 20, 2026
Merged

Commit the formatting, and stop the release from dirtying its own tree#192
brentrager merged 2 commits into
mainfrom
fix/format-drift

Conversation

@brentrager

Copy link
Copy Markdown
Contributor

What broke

Dropping cargo publish --allow-dirty (#186) surfaced what the flag had been hiding. The 4.5.2 release published to npm and PyPI, then:

error: 1 files in the working directory contain changes that were not yet committed into git:
rust/logger/README.md
to proceed despite this and include the uncommitted changes, pass the `--allow-dirty` flag

crates.io, the Go tag, and NuGet were all skipped.

Where the dirt comes from

release.yml's own Format step. It runs pnpm format, which rewrites files and then never commits them — so cargo publish, a few steps later, is looking at a dirty tree. --allow-dirty existed to shrug that off, which means every crate published from this repo silently carried uncommitted reformatting.

And main really is format-drifted, across seven files:

filedrift
.claude/settings.json4-space indent vs oxfmt's 2
README.md94 lines
CHANGELOG.md8 lines
package.jsondevDependencies unsorted, peerDependencies out of position
python/tests/test_otel_correlation.pyruff
src/Logger.otel.spec.tsoxfmt
rust/logger/README.md*errors*_errors_

Nothing was checking. PR checks run oxlint but never a formatter check, and pnpm format:check did not exist — despite release.yml having had a Format step the whole time.

Fix

  1. Commit the formatting.pnpm format is now a no-op on main.
  2. Add format:checkoxfmt --check + ruff format --check + cargo fmt --check + gofmt -l — and run it in PR checks so this cannot drift again.
  3. release.yml's FormatFormat check. Check, never rewrite. A release pipeline that mutates the tree and discards the result is precisely what made --allow-dirty look necessary.

The part that would have bitten again next release

changeset version writes CHANGELOG.md and package.json, and oxfmt wants both formatted differently from what changesets emits. Without handling that, the very next release PR lands unformatted, its format:check goes red, and cargo publish --locked breaks all over again. So the version lifecycle now ends with oxfmt --write CHANGELOG.md package.json, inside the same command whose output changesets/action commits:

"version": "changeset version && node scripts/sync-versions.mjs && oxfmt --write CHANGELOG.md package.json"

Verification

  • pnpm format:check → exit 0 on this branch.
  • Hand-broke it twice — trailing whitespace in rust/logger/README.md, and mangled import spacing in src/Logger.otel.spec.ts — and confirmed exit 1 both times, then green again after pnpm format.
  • node scripts/check-versions.mjs → OK at 4.5.2; vitest 89 passing; go test ./... ok.

After this merges

The 4.5.2 release needs finishing: npm and PyPI have it, crates.io / the Go tag / NuGet do not. Merging this makes the tree clean, and re-running the Release workflow will publish the remainder.

🤖 Generated with Claude Code

https://claude.ai/code/session_0152bbE1veqfG1SVJdyLCBxC

@changeset-bot

changeset-botBot commented Aug 20, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: bccefed

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
NameType
@smooai/loggerPatch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

brentragerand others added 2 commits August 20, 2026 14:51
Dropping `cargo publish --allow-dirty` (#186) surfaced what the flag had been
hiding for who knows how long:
error: 1 files in the working directory contain changes that were not yet
committed into git:
rust/logger/README.md
The dirt comes from release.yml's own `Format` step. It runs `pnpm format`,
which REWRITES files and then never commits them — so `cargo publish` a few
steps later stares at a dirty tree. `--allow-dirty` existed to shrug that off,
which meant every published crate silently carried uncommitted reformatting.
main is format-drifted across seven files: .claude/settings.json (4-space vs
oxfmt's 2), README.md (94 lines), CHANGELOG.md, package.json (devDependencies
unsorted, peerDependencies out of position), a Python test, a TS spec, and
rust/logger/README.md. Nothing checked: PR checks run oxlint but never a
formatter check, and `pnpm format:check` did not exist.
Three changes:
1. Commit the formatting. `pnpm format` is now a no-op on main.
2. Add `format:check` (oxfmt + ruff + cargo fmt + gofmt) and run it in PR
checks, so this cannot drift again. Verified red by hand-breaking both a
markdown file and a TS file.
3. release.yml's `Format` step becomes `Format check` — check, never rewrite. A
release pipeline that mutates the tree and discards the result is exactly the
thing that made `--allow-dirty` look necessary.
Also: `changeset version` writes CHANGELOG.md and package.json, and oxfmt wants
both formatted differently, so the version lifecycle now ends with
`oxfmt --write CHANGELOG.md package.json`. Without it the very next release PR
would land unformatted and break `cargo publish --locked` all over again.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0152bbE1veqfG1SVJdyLCBxC
Needed for its own sake (this changes package.json scripts) and to unstick the
release: crates.io, NuGet and the Go tag stalled at 4.5.0 while npm and PyPI
reached 4.5.2, and the downstream publish steps only fire when changesets
reports it published something — which needs a version bump.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0152bbE1veqfG1SVJdyLCBxC
@brentrager
brentrager merged commit be2b735 into mainAug 20, 2026
1 check passed
@brentrager
brentrager deleted the fix/format-drift branch August 20, 2026 18:54
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

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

Commit the formatting, and stop the release from dirtying its own tree - #192

Merged
brentrager merged 2 commits into
mainfrom
fix/format-drift
Aug 20, 2026
Merged

Commit the formatting, and stop the release from dirtying its own tree#192
brentrager merged 2 commits into
mainfrom
fix/format-drift

Conversation

@brentrager

Copy link
Copy Markdown
Contributor

What broke

Dropping cargo publish --allow-dirty (#186) surfaced what the flag had been hiding. The 4.5.2 release published to npm and PyPI, then:

error: 1 files in the working directory contain changes that were not yet committed into git:
rust/logger/README.md
to proceed despite this and include the uncommitted changes, pass the `--allow-dirty` flag

crates.io, the Go tag, and NuGet were all skipped.

Where the dirt comes from

release.yml's own Format step. It runs pnpm format, which rewrites files and then never commits them — so cargo publish, a few steps later, is looking at a dirty tree. --allow-dirty existed to shrug that off, which means every crate published from this repo silently carried uncommitted reformatting.

And main really is format-drifted, across seven files:

filedrift
.claude/settings.json4-space indent vs oxfmt's 2
README.md94 lines
CHANGELOG.md8 lines
package.jsondevDependencies unsorted, peerDependencies out of position
python/tests/test_otel_correlation.pyruff
src/Logger.otel.spec.tsoxfmt
rust/logger/README.md*errors*_errors_

Nothing was checking. PR checks run oxlint but never a formatter check, and pnpm format:check did not exist — despite release.yml having had a Format step the whole time.

Fix

  1. Commit the formatting.pnpm format is now a no-op on main.
  2. Add format:checkoxfmt --check + ruff format --check + cargo fmt --check + gofmt -l — and run it in PR checks so this cannot drift again.
  3. release.yml's FormatFormat check. Check, never rewrite. A release pipeline that mutates the tree and discards the result is precisely what made --allow-dirty look necessary.

The part that would have bitten again next release

changeset version writes CHANGELOG.md and package.json, and oxfmt wants both formatted differently from what changesets emits. Without handling that, the very next release PR lands unformatted, its format:check goes red, and cargo publish --locked breaks all over again. So the version lifecycle now ends with oxfmt --write CHANGELOG.md package.json, inside the same command whose output changesets/action commits:

"version": "changeset version && node scripts/sync-versions.mjs && oxfmt --write CHANGELOG.md package.json"

Verification

  • pnpm format:check → exit 0 on this branch.
  • Hand-broke it twice — trailing whitespace in rust/logger/README.md, and mangled import spacing in src/Logger.otel.spec.ts — and confirmed exit 1 both times, then green again after pnpm format.
  • node scripts/check-versions.mjs → OK at 4.5.2; vitest 89 passing; go test ./... ok.

After this merges

The 4.5.2 release needs finishing: npm and PyPI have it, crates.io / the Go tag / NuGet do not. Merging this makes the tree clean, and re-running the Release workflow will publish the remainder.

🤖 Generated with Claude Code

https://claude.ai/code/session_0152bbE1veqfG1SVJdyLCBxC

@changeset-bot

changeset-botBot commented Aug 20, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: bccefed

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
NameType
@smooai/loggerPatch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

brentragerand others added 2 commits August 20, 2026 14:51
Dropping `cargo publish --allow-dirty` (#186) surfaced what the flag had been
hiding for who knows how long:
error: 1 files in the working directory contain changes that were not yet
committed into git:
rust/logger/README.md
The dirt comes from release.yml's own `Format` step. It runs `pnpm format`,
which REWRITES files and then never commits them — so `cargo publish` a few
steps later stares at a dirty tree. `--allow-dirty` existed to shrug that off,
which meant every published crate silently carried uncommitted reformatting.
main is format-drifted across seven files: .claude/settings.json (4-space vs
oxfmt's 2), README.md (94 lines), CHANGELOG.md, package.json (devDependencies
unsorted, peerDependencies out of position), a Python test, a TS spec, and
rust/logger/README.md. Nothing checked: PR checks run oxlint but never a
formatter check, and `pnpm format:check` did not exist.
Three changes:
1. Commit the formatting. `pnpm format` is now a no-op on main.
2. Add `format:check` (oxfmt + ruff + cargo fmt + gofmt) and run it in PR
checks, so this cannot drift again. Verified red by hand-breaking both a
markdown file and a TS file.
3. release.yml's `Format` step becomes `Format check` — check, never rewrite. A
release pipeline that mutates the tree and discards the result is exactly the
thing that made `--allow-dirty` look necessary.
Also: `changeset version` writes CHANGELOG.md and package.json, and oxfmt wants
both formatted differently, so the version lifecycle now ends with
`oxfmt --write CHANGELOG.md package.json`. Without it the very next release PR
would land unformatted and break `cargo publish --locked` all over again.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0152bbE1veqfG1SVJdyLCBxC
Needed for its own sake (this changes package.json scripts) and to unstick the
release: crates.io, NuGet and the Go tag stalled at 4.5.0 while npm and PyPI
reached 4.5.2, and the downstream publish steps only fire when changesets
reports it published something — which needs a version bump.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0152bbE1veqfG1SVJdyLCBxC
@brentrager
brentrager merged commit be2b735 into mainAug 20, 2026
1 check passed
@brentrager
brentrager deleted the fix/format-drift branch August 20, 2026 18:54
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

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

Commit the formatting, and stop the release from dirtying its own tree - #192

Merged
brentrager merged 2 commits into
mainfrom
fix/format-drift
Aug 20, 2026
Merged

Commit the formatting, and stop the release from dirtying its own tree#192
brentrager merged 2 commits into
mainfrom
fix/format-drift

Conversation

@brentrager

Copy link
Copy Markdown
Contributor

What broke

Dropping cargo publish --allow-dirty (#186) surfaced what the flag had been hiding. The 4.5.2 release published to npm and PyPI, then:

error: 1 files in the working directory contain changes that were not yet committed into git:
rust/logger/README.md
to proceed despite this and include the uncommitted changes, pass the `--allow-dirty` flag

crates.io, the Go tag, and NuGet were all skipped.

Where the dirt comes from

release.yml's own Format step. It runs pnpm format, which rewrites files and then never commits them — so cargo publish, a few steps later, is looking at a dirty tree. --allow-dirty existed to shrug that off, which means every crate published from this repo silently carried uncommitted reformatting.

And main really is format-drifted, across seven files:

filedrift
.claude/settings.json4-space indent vs oxfmt's 2
README.md94 lines
CHANGELOG.md8 lines
package.jsondevDependencies unsorted, peerDependencies out of position
python/tests/test_otel_correlation.pyruff
src/Logger.otel.spec.tsoxfmt
rust/logger/README.md*errors*_errors_

Nothing was checking. PR checks run oxlint but never a formatter check, and pnpm format:check did not exist — despite release.yml having had a Format step the whole time.

Fix

  1. Commit the formatting.pnpm format is now a no-op on main.
  2. Add format:checkoxfmt --check + ruff format --check + cargo fmt --check + gofmt -l — and run it in PR checks so this cannot drift again.
  3. release.yml's FormatFormat check. Check, never rewrite. A release pipeline that mutates the tree and discards the result is precisely what made --allow-dirty look necessary.

The part that would have bitten again next release

changeset version writes CHANGELOG.md and package.json, and oxfmt wants both formatted differently from what changesets emits. Without handling that, the very next release PR lands unformatted, its format:check goes red, and cargo publish --locked breaks all over again. So the version lifecycle now ends with oxfmt --write CHANGELOG.md package.json, inside the same command whose output changesets/action commits:

"version": "changeset version && node scripts/sync-versions.mjs && oxfmt --write CHANGELOG.md package.json"

Verification

  • pnpm format:check → exit 0 on this branch.
  • Hand-broke it twice — trailing whitespace in rust/logger/README.md, and mangled import spacing in src/Logger.otel.spec.ts — and confirmed exit 1 both times, then green again after pnpm format.
  • node scripts/check-versions.mjs → OK at 4.5.2; vitest 89 passing; go test ./... ok.

After this merges

The 4.5.2 release needs finishing: npm and PyPI have it, crates.io / the Go tag / NuGet do not. Merging this makes the tree clean, and re-running the Release workflow will publish the remainder.

🤖 Generated with Claude Code

https://claude.ai/code/session_0152bbE1veqfG1SVJdyLCBxC

@changeset-bot

changeset-botBot commented Aug 20, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: bccefed

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
NameType
@smooai/loggerPatch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

brentragerand others added 2 commits August 20, 2026 14:51
Dropping `cargo publish --allow-dirty` (#186) surfaced what the flag had been
hiding for who knows how long:
error: 1 files in the working directory contain changes that were not yet
committed into git:
rust/logger/README.md
The dirt comes from release.yml's own `Format` step. It runs `pnpm format`,
which REWRITES files and then never commits them — so `cargo publish` a few
steps later stares at a dirty tree. `--allow-dirty` existed to shrug that off,
which meant every published crate silently carried uncommitted reformatting.
main is format-drifted across seven files: .claude/settings.json (4-space vs
oxfmt's 2), README.md (94 lines), CHANGELOG.md, package.json (devDependencies
unsorted, peerDependencies out of position), a Python test, a TS spec, and
rust/logger/README.md. Nothing checked: PR checks run oxlint but never a
formatter check, and `pnpm format:check` did not exist.
Three changes:
1. Commit the formatting. `pnpm format` is now a no-op on main.
2. Add `format:check` (oxfmt + ruff + cargo fmt + gofmt) and run it in PR
checks, so this cannot drift again. Verified red by hand-breaking both a
markdown file and a TS file.
3. release.yml's `Format` step becomes `Format check` — check, never rewrite. A
release pipeline that mutates the tree and discards the result is exactly the
thing that made `--allow-dirty` look necessary.
Also: `changeset version` writes CHANGELOG.md and package.json, and oxfmt wants
both formatted differently, so the version lifecycle now ends with
`oxfmt --write CHANGELOG.md package.json`. Without it the very next release PR
would land unformatted and break `cargo publish --locked` all over again.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0152bbE1veqfG1SVJdyLCBxC
Needed for its own sake (this changes package.json scripts) and to unstick the
release: crates.io, NuGet and the Go tag stalled at 4.5.0 while npm and PyPI
reached 4.5.2, and the downstream publish steps only fire when changesets
reports it published something — which needs a version bump.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0152bbE1veqfG1SVJdyLCBxC
@brentrager
brentrager merged commit be2b735 into mainAug 20, 2026
1 check passed
@brentrager
brentrager deleted the fix/format-drift branch August 20, 2026 18:54
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

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

Commit the formatting, and stop the release from dirtying its own tree - #192

Merged
brentrager merged 2 commits into
mainfrom
fix/format-drift
Aug 20, 2026
Merged

Commit the formatting, and stop the release from dirtying its own tree#192
brentrager merged 2 commits into
mainfrom
fix/format-drift

Conversation

@brentrager

Copy link
Copy Markdown
Contributor

What broke

Dropping cargo publish --allow-dirty (#186) surfaced what the flag had been hiding. The 4.5.2 release published to npm and PyPI, then:

error: 1 files in the working directory contain changes that were not yet committed into git:
rust/logger/README.md
to proceed despite this and include the uncommitted changes, pass the `--allow-dirty` flag

crates.io, the Go tag, and NuGet were all skipped.

Where the dirt comes from

release.yml's own Format step. It runs pnpm format, which rewrites files and then never commits them — so cargo publish, a few steps later, is looking at a dirty tree. --allow-dirty existed to shrug that off, which means every crate published from this repo silently carried uncommitted reformatting.

And main really is format-drifted, across seven files:

filedrift
.claude/settings.json4-space indent vs oxfmt's 2
README.md94 lines
CHANGELOG.md8 lines
package.jsondevDependencies unsorted, peerDependencies out of position
python/tests/test_otel_correlation.pyruff
src/Logger.otel.spec.tsoxfmt
rust/logger/README.md*errors*_errors_

Nothing was checking. PR checks run oxlint but never a formatter check, and pnpm format:check did not exist — despite release.yml having had a Format step the whole time.

Fix

  1. Commit the formatting.pnpm format is now a no-op on main.
  2. Add format:checkoxfmt --check + ruff format --check + cargo fmt --check + gofmt -l — and run it in PR checks so this cannot drift again.
  3. release.yml's FormatFormat check. Check, never rewrite. A release pipeline that mutates the tree and discards the result is precisely what made --allow-dirty look necessary.

The part that would have bitten again next release

changeset version writes CHANGELOG.md and package.json, and oxfmt wants both formatted differently from what changesets emits. Without handling that, the very next release PR lands unformatted, its format:check goes red, and cargo publish --locked breaks all over again. So the version lifecycle now ends with oxfmt --write CHANGELOG.md package.json, inside the same command whose output changesets/action commits:

"version": "changeset version && node scripts/sync-versions.mjs && oxfmt --write CHANGELOG.md package.json"

Verification

  • pnpm format:check → exit 0 on this branch.
  • Hand-broke it twice — trailing whitespace in rust/logger/README.md, and mangled import spacing in src/Logger.otel.spec.ts — and confirmed exit 1 both times, then green again after pnpm format.
  • node scripts/check-versions.mjs → OK at 4.5.2; vitest 89 passing; go test ./... ok.

After this merges

The 4.5.2 release needs finishing: npm and PyPI have it, crates.io / the Go tag / NuGet do not. Merging this makes the tree clean, and re-running the Release workflow will publish the remainder.

🤖 Generated with Claude Code

https://claude.ai/code/session_0152bbE1veqfG1SVJdyLCBxC

@changeset-bot

changeset-botBot commented Aug 20, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: bccefed

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
NameType
@smooai/loggerPatch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

brentragerand others added 2 commits August 20, 2026 14:51
Dropping `cargo publish --allow-dirty` (#186) surfaced what the flag had been
hiding for who knows how long:
error: 1 files in the working directory contain changes that were not yet
committed into git:
rust/logger/README.md
The dirt comes from release.yml's own `Format` step. It runs `pnpm format`,
which REWRITES files and then never commits them — so `cargo publish` a few
steps later stares at a dirty tree. `--allow-dirty` existed to shrug that off,
which meant every published crate silently carried uncommitted reformatting.
main is format-drifted across seven files: .claude/settings.json (4-space vs
oxfmt's 2), README.md (94 lines), CHANGELOG.md, package.json (devDependencies
unsorted, peerDependencies out of position), a Python test, a TS spec, and
rust/logger/README.md. Nothing checked: PR checks run oxlint but never a
formatter check, and `pnpm format:check` did not exist.
Three changes:
1. Commit the formatting. `pnpm format` is now a no-op on main.
2. Add `format:check` (oxfmt + ruff + cargo fmt + gofmt) and run it in PR
checks, so this cannot drift again. Verified red by hand-breaking both a
markdown file and a TS file.
3. release.yml's `Format` step becomes `Format check` — check, never rewrite. A
release pipeline that mutates the tree and discards the result is exactly the
thing that made `--allow-dirty` look necessary.
Also: `changeset version` writes CHANGELOG.md and package.json, and oxfmt wants
both formatted differently, so the version lifecycle now ends with
`oxfmt --write CHANGELOG.md package.json`. Without it the very next release PR
would land unformatted and break `cargo publish --locked` all over again.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0152bbE1veqfG1SVJdyLCBxC
Needed for its own sake (this changes package.json scripts) and to unstick the
release: crates.io, NuGet and the Go tag stalled at 4.5.0 while npm and PyPI
reached 4.5.2, and the downstream publish steps only fire when changesets
reports it published something — which needs a version bump.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0152bbE1veqfG1SVJdyLCBxC
@brentrager
brentrager merged commit be2b735 into mainAug 20, 2026
1 check passed
@brentrager
brentrager deleted the fix/format-drift branch August 20, 2026 18:54
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

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

Commit the formatting, and stop the release from dirtying its own tree - #192

Merged
brentrager merged 2 commits into
mainfrom
fix/format-drift
Aug 20, 2026
Merged

Commit the formatting, and stop the release from dirtying its own tree#192
brentrager merged 2 commits into
mainfrom
fix/format-drift

Conversation

@brentrager

Copy link
Copy Markdown
Contributor

What broke

Dropping cargo publish --allow-dirty (#186) surfaced what the flag had been hiding. The 4.5.2 release published to npm and PyPI, then:

error: 1 files in the working directory contain changes that were not yet committed into git:
rust/logger/README.md
to proceed despite this and include the uncommitted changes, pass the `--allow-dirty` flag

crates.io, the Go tag, and NuGet were all skipped.

Where the dirt comes from

release.yml's own Format step. It runs pnpm format, which rewrites files and then never commits them — so cargo publish, a few steps later, is looking at a dirty tree. --allow-dirty existed to shrug that off, which means every crate published from this repo silently carried uncommitted reformatting.

And main really is format-drifted, across seven files:

filedrift
.claude/settings.json4-space indent vs oxfmt's 2
README.md94 lines
CHANGELOG.md8 lines
package.jsondevDependencies unsorted, peerDependencies out of position
python/tests/test_otel_correlation.pyruff
src/Logger.otel.spec.tsoxfmt
rust/logger/README.md*errors*_errors_

Nothing was checking. PR checks run oxlint but never a formatter check, and pnpm format:check did not exist — despite release.yml having had a Format step the whole time.

Fix

  1. Commit the formatting.pnpm format is now a no-op on main.
  2. Add format:checkoxfmt --check + ruff format --check + cargo fmt --check + gofmt -l — and run it in PR checks so this cannot drift again.
  3. release.yml's FormatFormat check. Check, never rewrite. A release pipeline that mutates the tree and discards the result is precisely what made --allow-dirty look necessary.

The part that would have bitten again next release

changeset version writes CHANGELOG.md and package.json, and oxfmt wants both formatted differently from what changesets emits. Without handling that, the very next release PR lands unformatted, its format:check goes red, and cargo publish --locked breaks all over again. So the version lifecycle now ends with oxfmt --write CHANGELOG.md package.json, inside the same command whose output changesets/action commits:

"version": "changeset version && node scripts/sync-versions.mjs && oxfmt --write CHANGELOG.md package.json"

Verification

  • pnpm format:check → exit 0 on this branch.
  • Hand-broke it twice — trailing whitespace in rust/logger/README.md, and mangled import spacing in src/Logger.otel.spec.ts — and confirmed exit 1 both times, then green again after pnpm format.
  • node scripts/check-versions.mjs → OK at 4.5.2; vitest 89 passing; go test ./... ok.

After this merges

The 4.5.2 release needs finishing: npm and PyPI have it, crates.io / the Go tag / NuGet do not. Merging this makes the tree clean, and re-running the Release workflow will publish the remainder.

🤖 Generated with Claude Code

https://claude.ai/code/session_0152bbE1veqfG1SVJdyLCBxC

@changeset-bot

changeset-botBot commented Aug 20, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: bccefed

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
NameType
@smooai/loggerPatch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

brentragerand others added 2 commits August 20, 2026 14:51
Dropping `cargo publish --allow-dirty` (#186) surfaced what the flag had been
hiding for who knows how long:
error: 1 files in the working directory contain changes that were not yet
committed into git:
rust/logger/README.md
The dirt comes from release.yml's own `Format` step. It runs `pnpm format`,
which REWRITES files and then never commits them — so `cargo publish` a few
steps later stares at a dirty tree. `--allow-dirty` existed to shrug that off,
which meant every published crate silently carried uncommitted reformatting.
main is format-drifted across seven files: .claude/settings.json (4-space vs
oxfmt's 2), README.md (94 lines), CHANGELOG.md, package.json (devDependencies
unsorted, peerDependencies out of position), a Python test, a TS spec, and
rust/logger/README.md. Nothing checked: PR checks run oxlint but never a
formatter check, and `pnpm format:check` did not exist.
Three changes:
1. Commit the formatting. `pnpm format` is now a no-op on main.
2. Add `format:check` (oxfmt + ruff + cargo fmt + gofmt) and run it in PR
checks, so this cannot drift again. Verified red by hand-breaking both a
markdown file and a TS file.
3. release.yml's `Format` step becomes `Format check` — check, never rewrite. A
release pipeline that mutates the tree and discards the result is exactly the
thing that made `--allow-dirty` look necessary.
Also: `changeset version` writes CHANGELOG.md and package.json, and oxfmt wants
both formatted differently, so the version lifecycle now ends with
`oxfmt --write CHANGELOG.md package.json`. Without it the very next release PR
would land unformatted and break `cargo publish --locked` all over again.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0152bbE1veqfG1SVJdyLCBxC
Needed for its own sake (this changes package.json scripts) and to unstick the
release: crates.io, NuGet and the Go tag stalled at 4.5.0 while npm and PyPI
reached 4.5.2, and the downstream publish steps only fire when changesets
reports it published something — which needs a version bump.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0152bbE1veqfG1SVJdyLCBxC
@brentrager
brentrager merged commit be2b735 into mainAug 20, 2026
1 check passed
@brentrager
brentrager deleted the fix/format-drift branch August 20, 2026 18:54
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

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

Commit the formatting, and stop the release from dirtying its own tree - #192

Merged
brentrager merged 2 commits into
mainfrom
fix/format-drift
Aug 20, 2026
Merged

Commit the formatting, and stop the release from dirtying its own tree#192
brentrager merged 2 commits into
mainfrom
fix/format-drift

Conversation

@brentrager

Copy link
Copy Markdown
Contributor

What broke

Dropping cargo publish --allow-dirty (#186) surfaced what the flag had been hiding. The 4.5.2 release published to npm and PyPI, then:

error: 1 files in the working directory contain changes that were not yet committed into git:
rust/logger/README.md
to proceed despite this and include the uncommitted changes, pass the `--allow-dirty` flag

crates.io, the Go tag, and NuGet were all skipped.

Where the dirt comes from

release.yml's own Format step. It runs pnpm format, which rewrites files and then never commits them — so cargo publish, a few steps later, is looking at a dirty tree. --allow-dirty existed to shrug that off, which means every crate published from this repo silently carried uncommitted reformatting.

And main really is format-drifted, across seven files:

filedrift
.claude/settings.json4-space indent vs oxfmt's 2
README.md94 lines
CHANGELOG.md8 lines
package.jsondevDependencies unsorted, peerDependencies out of position
python/tests/test_otel_correlation.pyruff
src/Logger.otel.spec.tsoxfmt
rust/logger/README.md*errors*_errors_

Nothing was checking. PR checks run oxlint but never a formatter check, and pnpm format:check did not exist — despite release.yml having had a Format step the whole time.

Fix

  1. Commit the formatting.pnpm format is now a no-op on main.
  2. Add format:checkoxfmt --check + ruff format --check + cargo fmt --check + gofmt -l — and run it in PR checks so this cannot drift again.
  3. release.yml's FormatFormat check. Check, never rewrite. A release pipeline that mutates the tree and discards the result is precisely what made --allow-dirty look necessary.

The part that would have bitten again next release

changeset version writes CHANGELOG.md and package.json, and oxfmt wants both formatted differently from what changesets emits. Without handling that, the very next release PR lands unformatted, its format:check goes red, and cargo publish --locked breaks all over again. So the version lifecycle now ends with oxfmt --write CHANGELOG.md package.json, inside the same command whose output changesets/action commits:

"version": "changeset version && node scripts/sync-versions.mjs && oxfmt --write CHANGELOG.md package.json"

Verification

  • pnpm format:check → exit 0 on this branch.
  • Hand-broke it twice — trailing whitespace in rust/logger/README.md, and mangled import spacing in src/Logger.otel.spec.ts — and confirmed exit 1 both times, then green again after pnpm format.
  • node scripts/check-versions.mjs → OK at 4.5.2; vitest 89 passing; go test ./... ok.

After this merges

The 4.5.2 release needs finishing: npm and PyPI have it, crates.io / the Go tag / NuGet do not. Merging this makes the tree clean, and re-running the Release workflow will publish the remainder.

🤖 Generated with Claude Code

https://claude.ai/code/session_0152bbE1veqfG1SVJdyLCBxC

@changeset-bot

changeset-botBot commented Aug 20, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: bccefed

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
NameType
@smooai/loggerPatch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

brentragerand others added 2 commits August 20, 2026 14:51
Dropping `cargo publish --allow-dirty` (#186) surfaced what the flag had been
hiding for who knows how long:
error: 1 files in the working directory contain changes that were not yet
committed into git:
rust/logger/README.md
The dirt comes from release.yml's own `Format` step. It runs `pnpm format`,
which REWRITES files and then never commits them — so `cargo publish` a few
steps later stares at a dirty tree. `--allow-dirty` existed to shrug that off,
which meant every published crate silently carried uncommitted reformatting.
main is format-drifted across seven files: .claude/settings.json (4-space vs
oxfmt's 2), README.md (94 lines), CHANGELOG.md, package.json (devDependencies
unsorted, peerDependencies out of position), a Python test, a TS spec, and
rust/logger/README.md. Nothing checked: PR checks run oxlint but never a
formatter check, and `pnpm format:check` did not exist.
Three changes:
1. Commit the formatting. `pnpm format` is now a no-op on main.
2. Add `format:check` (oxfmt + ruff + cargo fmt + gofmt) and run it in PR
checks, so this cannot drift again. Verified red by hand-breaking both a
markdown file and a TS file.
3. release.yml's `Format` step becomes `Format check` — check, never rewrite. A
release pipeline that mutates the tree and discards the result is exactly the
thing that made `--allow-dirty` look necessary.
Also: `changeset version` writes CHANGELOG.md and package.json, and oxfmt wants
both formatted differently, so the version lifecycle now ends with
`oxfmt --write CHANGELOG.md package.json`. Without it the very next release PR
would land unformatted and break `cargo publish --locked` all over again.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0152bbE1veqfG1SVJdyLCBxC
Needed for its own sake (this changes package.json scripts) and to unstick the
release: crates.io, NuGet and the Go tag stalled at 4.5.0 while npm and PyPI
reached 4.5.2, and the downstream publish steps only fire when changesets
reports it published something — which needs a version bump.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0152bbE1veqfG1SVJdyLCBxC
@brentrager
brentrager merged commit be2b735 into mainAug 20, 2026
1 check passed
@brentrager
brentrager deleted the fix/format-drift branch August 20, 2026 18:54
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

@brentrager