test(queue): borg dat de leeskant geen HTML-entiteiten introduceert #110

Merged
janpeter merged 1 commit from claude/jolly-jemison-74bdd1 into main 2026-07-27 08:19:14 +02:00
Owner

De body van bericht 8ceedd5d kwam bij max2 binnen met &lt;, &gt; en &amp; in plaats van <, > en &, terwijl de Postgres-kolom aantoonbaar schoon was. Deze PR legt vast wat er wél en niet gemeten is, en zet een guard neer die de vraag "zit het in de MCP?" voortaan in één run beantwoordt.

Wat er is uitgesloten — met meting, niet met redenering

Laag Meting
Postgres-kolom schoon; identieke sha vanaf mac én max2
queue_push (schrijfpad) byte-exact, ook bij 10 KB via --file
messageView / toolJson broncode + git log -S over de hele historie: escaping-code heeft nooit bestaan
queue_status / queue_next byte-exact op beide hosts
s4m-queue CLI byte-exact op beide hosts
NOTIFY-payload draagt de body helemaal niet (RETURNING * levert 'm)

Herhaald met de byte-exacte originele body (10 KB, zelfde tool, zelfde clientversie, geen compaction): niet gereproduceerd. Wat overblijft is de client-/agent-leg op die host tijdens díé sessie — bij eliminatie vastgesteld, niet positief aangewezen. Daarom een guard plus documentatie, en géén fix in de MCP.

De guard

__tests__/queue-entity-transparency.test.ts dekt messageView + toolJson en bevat een al-geëscapete regel als discriminant, zodat hij het verschil tussen één en twee lagen escaping ziet — een test met alleen rauwe tekens ziet dat niet.

Sensitiviteit gecontroleerd door de bug tijdelijk in messageView te injecteren: 5/5 rood, 5/5 groen na terugdraaien. Een groene test die niet rood kán worden bewijst niets.

Praktische regel (in CLAUDE.md)

Stuur bij bestandsinhoud altijd een sha256 (+ bytes/regels) mee in de verification. Bij 8ceedd5d ving die check het af; zonder zo'n check schrijft een ontvanger stil &lt; naar schijf. Queue-berichten bevatten routinematig <server>:<model>, && en shell-fragmenten.

Verificatie

npm test: 181 bestanden / 1367 tests groen, 3 bestanden + 29 tests geskipt (integratie, vereist TEST_DATABASE_URL). Typecheck schoon.

🤖 Generated with Claude Code

De body van bericht `8ceedd5d` kwam bij max2 binnen met `&lt;`, `&gt;` en `&amp;` in plaats van `<`, `>` en `&`, terwijl de Postgres-kolom aantoonbaar schoon was. Deze PR legt vast wat er wél en niet gemeten is, en zet een guard neer die de vraag "zit het in de MCP?" voortaan in één run beantwoordt. ## Wat er is uitgesloten — met meting, niet met redenering | Laag | Meting | |---|---| | Postgres-kolom | schoon; identieke sha vanaf mac én max2 | | `queue_push` (schrijfpad) | byte-exact, ook bij 10 KB via `--file` | | `messageView` / `toolJson` | broncode + `git log -S` over de hele historie: escaping-code heeft nooit bestaan | | `queue_status` / `queue_next` | byte-exact op beide hosts | | `s4m-queue` CLI | byte-exact op beide hosts | | NOTIFY-payload | draagt de body helemaal niet (`RETURNING *` levert 'm) | Herhaald met de **byte-exacte originele body** (10 KB, zelfde tool, zelfde clientversie, geen compaction): niet gereproduceerd. Wat overblijft is de client-/agent-leg op die host tijdens díé sessie — **bij eliminatie vastgesteld, niet positief aangewezen**. Daarom een guard plus documentatie, en géén fix in de MCP. ## De guard `__tests__/queue-entity-transparency.test.ts` dekt `messageView` + `toolJson` en bevat een al-geëscapete regel als discriminant, zodat hij het verschil tussen één en twee lagen escaping ziet — een test met alleen rauwe tekens ziet dat niet. Sensitiviteit gecontroleerd door de bug tijdelijk in `messageView` te injecteren: **5/5 rood**, 5/5 groen na terugdraaien. Een groene test die niet rood kán worden bewijst niets. ## Praktische regel (in CLAUDE.md) Stuur bij bestandsinhoud altijd een sha256 (+ bytes/regels) mee in de `verification`. Bij `8ceedd5d` ving die check het af; zonder zo'n check schrijft een ontvanger stil `&lt;` naar schijf. Queue-berichten bevatten routinematig `<server>:<model>`, `&&` en shell-fragmenten. ## Verificatie `npm test`: 181 bestanden / 1367 tests groen, 3 bestanden + 29 tests geskipt (integratie, vereist `TEST_DATABASE_URL`). Typecheck schoon. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
test(queue): borg dat de leeskant geen HTML-entiteiten introduceert
All checks were successful
CI / Verify (pull_request) Successful in 1m55s
5da429eb0c
Aanleiding: de body van bericht 8ceedd5d kwam bij max2 binnen met &lt;, &gt;
en &amp; in plaats van <, > en &, terwijl de Postgres-kolom aantoonbaar schoon
was. Vaststellen dat de MCP niet de boosdoener was kostte een meetronde over
drie hosts; deze test beantwoordt die vraag voortaan in één run.

Uitgesloten met meting, niet met redenering:
- Postgres-kolom schoon (identieke sha vanaf mac en max2)
- queue_push byte-exact, ook bij 10 KB via --file
- queue_status en queue_next byte-exact op beide hosts
- s4m-queue CLI byte-exact op beide hosts
- messageView/toolJson: git log -S over de hele historie vindt nooit
  escaping-code; de body komt uit RETURNING *, niet uit de NOTIFY-envelope

Herhaald met de byte-exacte originele body (10 KB, zelfde tool, zelfde
clientversie, geen compaction): niet gereproduceerd. Wat overblijft is de
client-/agent-leg op die host tijdens die sessie -- bij eliminatie
vastgesteld, niet positief aangewezen. Daarom een guard plus documentatie,
geen fix in de MCP.

De test dekt messageView + toolJson en bevat een al-geescapete regel als
discriminant, zodat hij het verschil tussen een en twee lagen escaping ziet.
Sensitiviteit gecontroleerd door de bug tijdelijk in messageView te
injecteren: 5/5 rood, 5/5 groen na terugdraaien.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
janpeter/scrum4me-mcp!110
No description provided.