style: remove every em dash from the site, and guard against the next one - #40
Merged
Conversation
… one The no-em-dash rule was already house style. The site carried twenty-six occurrences anyway, across seven files, and the reason is visible in where they were hiding: a page title, an image alt attribute, a JSON data file, two source comments, and four loading placeholders. None of those are places prose review looks. Twenty-four em dashes and two en dashes, rewritten rather than repunctuated, so none of them reads like a dash was swapped for a colon and left dangling: "Marketplace - Build with..." -> "Marketplace: Build with..." "Toolkit-from framework adapters" -> "Toolkit, from framework adapters" "Terminal 1 - leave running" -> "Terminal 1: leave running" "every agent action - signed by" -> "every agent action, signed by" "Name A-Z" / "Name Z-A" -> "Name A to Z" / "Name Z to A" The four in the Marketplace hero were not prose. They are the placeholder shown while the catalog loads, where an em dash stood in for a number that has not arrived yet. Replaced with an ellipsis, which reads as "still loading" rather than as punctuation. data/adoption.json was not in the original sweep because it arrived in #38 while this was in progress, which is the argument for the check rather than against it. tools/check-dashes.js runs in CI on every PR. It builds its offender table from code points rather than literals, because a checker containing the characters it bans reports itself, and the fix somebody reaches for at that point is an exemption for the checker. schema/ is exempt, deliberately: those files are byte-for-byte mirrors of trace-spec enforced by schema-parity, so a dash there is an upstream fix followed by a re-sync, and failing CI here for something CI here cannot act on only teaches people to ignore it. The same workflow now runs marketplace/marketplace.test.js, which covers the escaping and URL-scheme guards added in #31 after the catalog was found to be rendered from remote JSON without them. It was never wired to a workflow, so it has been passing or failing unobserved since. schema/trace-v0.2.json is re-synced from trace-spec rather than hand-edited, because schema-parity is a byte comparison and a partially-updated mirror is not a mirror. That pulls in more than the two descriptions: the published copy had already drifted, and the scheduled parity check has been RED since 2026-08-24. Anything fetching the canonical $id URL to validate a Trust Record has since been validating against a schema missing $defs/canonicalizableValue, the safe-integer maxima on iat, and the references block. The re-sync fixes that too. Upstream: agentrust-io/trace-spec#228. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014NL8o3PXq6kfs2SdmBv6ak
The parity job guards three published schemas as a set, and all three had drifted. Cleaning only trace-v0.2.json left the job red for the other two, which is both a broken check and a half-fix: the revocation schemas are published at the same $id pattern and fetched by the same verifiers. The drift is three "maximum": 9007199254740991 constraints, the safe-integer bounds upstream added alongside the ones in trace-v0.2.json. Until now the published copies accepted revocation records carrying integers no JSON parser round-trips reliably. No dashes in either file, which is why the original sweep did not reach them. Re-synced from upstream rather than hand-patched, for the reason in the previous commit: parity is a byte comparison and a partially-updated mirror is not a mirror. Both $id values verified unchanged. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014NL8o3PXq6kfs2SdmBv6ak
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
You flagged em dashes on the Marketplace. There were twenty-six across the site.
Where they were
The count is less interesting than the locations, which explain why a stated rule did not hold:
marketplace/index.htmlquickstart/index.htmlindex.htmlsupernav.jsllms.txtwcm/index.htmldata/adoption.jsonschema/trace-v0.2.jsonA page title, an
altattribute, a JSON data file and two source comments. None of those are places prose review looks, which is why a grep run once does not hold the line.data/adoption.jsonwas not in my original sweep. It arrived in #38 while this was in progress, which is the argument for the check rather than against it.The rewrites
Rewritten rather than repunctuated, so nothing reads like a dash was swapped for a colon and left dangling.
The four in the Marketplace hero were not prose at all: they are the placeholder shown while the catalog loads, where an em dash stood in for a number that has not arrived. Now an ellipsis, which reads as "still loading" rather than as punctuation.
The guard
tools/check-dashes.js, run in CI on every PR. Reports file, line, character name, and a suggested fix.It builds its offender table from code points rather than literals. A checker containing the characters it bans reports itself, and the fix somebody reaches for at that point is an exemption for the checker.
schema/is exempt, deliberately. Those files are byte-for-byte mirrors of trace-spec enforced byschema-parity, so a dash there is an upstream fix followed by a re-sync. Failing CI here for something CI here cannot act on only teaches people to ignore it.The same workflow now also runs
marketplace/marketplace.test.js, which covers the escaping and URL-scheme guards added in #31 after the catalog was found to be rendered from remote JSON without them. It was never wired to a workflow, so it has been passing or failing unobserved since.Please read this part: the published schema was stale
schema/trace-v0.2.jsonis re-synced from trace-spec rather than hand-edited, becauseschema-parityis a byte comparison and a partially-updated mirror is not a mirror.That pulls in more than the two descriptions, because the published copy had already drifted. The scheduled parity check has been failing since 2026-08-24. Anything fetching the canonical
$idURL to validate a Trust Record has since been validating against a schema missing:$defs/canonicalizableValueiatand the other numeric fieldsreferencesblockThe re-sync fixes that too, and turns the daily check green again. Upstream prerequisite agentrust-io/trace-spec#228 is merged.
🤖 Generated with Claude Code
https://claude.ai/code/session_014NL8o3PXq6kfs2SdmBv6ak