Skip to content

security: harden marketplace catalog rendering - #31

Merged
imran-siddique merged 1 commit into
mainfrom
security/harden-marketplace-rendering
Aug 23, 2026
Merged

security: harden marketplace catalog rendering#31
imran-siddique merged 1 commit into
mainfrom
security/harden-marketplace-rendering

Conversation

@imran-siddique

Copy link
Copy Markdown
Member

Security hardening prepared with reproducible evidence and tests. Please review and run required CI.

@imran-siddique
imran-siddique enabled auto-merge (squash) August 23, 2026 18:49
@imran-siddique
imran-siddique merged commit 1b5ae7c into main Aug 23, 2026
1 check passed
@imran-siddique
imran-siddique deleted the security/harden-marketplace-rendering branch August 23, 2026 19:41
imran-siddique added a commit that referenced this pull request Aug 27, 2026
… one (#40)

* style: remove every em dash from the site, and guard against the next 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

* fix(schema): re-sync the two revocation mirrors as well

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

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for free to 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