Skip to content

The tenant-audit census issue 13178 is unreachable (404) while three open cards cite it as their input #13548

Description

@claude

The measurement

Issue 13178 — the tenant-audit write-call-site census — is unreachable. It returns HTTP 404 on three independent channels: unauthenticated repo-scoped REST, the rendered web page, and authenticated MCP issue_read.

Four-channel control, all requests in the same minute, same session, same endpoint shape:

issue result
13178 404
13179 200
13250 200
13491 200
13497 200
13527 (the PR that landed its repairs) 200

The control fires, so the 404 is a fact about that number and not about the channel, the session, or a rate limit.

The card was real and recent. Its repairs are in main:

f087c376ff 2026-08-30 fix(service-storage): scope the sys_file / sys_upload_session update and
                      delete doors to the acting organization (#13178) (#13527)
e02648ef1b 2026-08-30 fix(service-storage): scope the sys_file / sys_upload_session update and
                      delete doors to the acting organization (#13178)

Two open cards still name it as their input — #13491 (domain:engine, a ruling on whether isSystem writes are in the tenant-audit control's scope) and #13497 (the stamper-gap measurement) — and #13416 cites it as well.

What it cost

#13497's brief was to classify the 24 sites the census identified. The census lived in a comment on #13178. With that comment gone, the canonical list of 24 could be neither copied nor verified — the re-location step that #13178's own ruling required (its line numbers were known to rot, so coordinates had to be re-derived rather than copied) had nothing to re-locate against.

What saved the round

Two things, both accidents of good practice rather than design:

  1. The census summary survived in-tree, because the tenant-audit: the "write without tenantId" signal is a throttled log warn gated on multi-tenant posture, so it cannot fire in any environment where code is exercised #13178 repair's changeset quoted the two figures that mattered. From .changeset/tenant-audit-update-delete-half-repairs.md, now merged:

    The tenant-audit census counted 175 service write call sites against a tenancy-enabled object, 24 of them carrying no tenant context at all

  2. An independent re-derivation agreed closely enough to establish the same population, which is what let the measurement proceed at all:

    census figure independently re-derived
    135 sites silenced by the isSystem guard before the posture gate 141
    127 of 175 statically decidable (48 runtime-parameter-name sites) 132 literal-object engine write call sites

    Close enough to be the same family; not close enough to be the same list. The exact 24 remain unrecoverable.

Recommendation

A census that decides a repair family's severity and a ruling's scope should be an in-tree artefact, not a comment.

The tree already has this pattern and it is enforced: the isSystem census is a committed page (content/docs/permissions/system-context.mdx) with a generator (scripts/isystem-census.mjs) and a gate (scripts/check-system-context-census.mjs, wired into the docs-anchors step). Its own commit message records the thing that makes the pattern necessary — that census numbers rot as main moves, and get re-derived against the merged tree rather than trusted.

Concretely, one of:

There is also a process question underneath, which is not mine to answer: whether an issue that open cards depend on can be deleted or transferred without those cards being updated, and whether anything would have noticed had the changeset not quoted the figures.

⚠️ Measured on origin/main at 50cf2940b9; the HTTP results are from that same session and are re-checkable at any time by repeating the table above.

Found while executing #13497; the PM seat re-checked the 404 independently with its own controls before this was filed. Not graded here: no priority or domain label, unassigned, for triage.

Generated by Claude Code


Generated by Claude Code

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions