Skip to content

§15 half-adopted: the XSS rule is wired but ships no fixture, so a green lint run is not evidence it fires #3

Description

@MichalAFerber

Found while reviewing #2. Filing it separately because it is not #2's job to fix, and because a gap declared only in a PR body disappears the moment that PR merges.

The gap

src/exporters/html.js renders HTML, so DS §15 requires both the interpolated-JSON rule and its fixture. #2 lands the rule and not the fixture.

Verified at head 237bd6eb:

  • eslint.config.js carries the rule — the JSON.stringify-into-a-template-literal guard, with its BAD/GOOD comment intact.
  • test/ contains exactly one file: test/pdf-vfs.test.js. No test/fixtures/xss-lint-fixture.js, no test/xss-lint-fixture.test.js, no test/fixtures/xss-lint-covers.json.
  • Control, so the absence is a fact about the repo rather than about the query: the identical tree listing against MichalAFerber/gh-office@main returns test/fixtures/xss-lint-fixture.js and test/xss-lint-fixture.test.js. The instrument finds fixtures where they exist.

Why the green lint run proves nothing

The rule currently reports zero findings here, because there is nothing to find: grep -rn 'JSON.stringify' src/ build/ test/ is empty, against a control of grep -rln 'function' src/ → 8 files. §15 is explicit that this is an unproven control, not coverage — a rule that has never fired is indistinguishable from a rule that cannot fire. The fixture is what turns the lint job from an assertion into a measurement.

That distinction has been the estate's dominant defect class this week, in reviews and in my own work, so it is worth stating plainly rather than treating as boilerplate.

What it needs

  • test/fixtures/xss-lint-fixture.js
  • test/xss-lint-fixture.test.js
  • test/fixtures/xss-lint-covers.json, naming product source: src/exporters/html.js, src/core.js, src/common.js. Not build/build.mjs — that is tooling and is globally ignored regardless.

Why it was not folded into #2

templates/xss-lint-fixture.test.js imports vitest, while this repo's suite is node:test. Adopting it means either adding a second test runner or porting the kit — and the kit must be vendored byte-identical, so porting is not available. That is a real decision, not a formality, and it belongs in its own change with its own argument.

Related

  • MichalAFerber/tgwab-standards#125 — the §15 sweep: five repos ship the rule with no fixture. This makes six.
  • MichalAFerber/mykk.us-extension#39 — same shape.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions