(motir-marketing) The legal documents moved without their MATERIALITY guard — no repository now asserts that a Terms revision was read before it shipped
Found by motir run MOTIR-3909 while building MOTIR-4007 (2026-09-01). It holds nothing up and is filed forward.
⚠️ NARROWED 2026-09-02, and the narrowing is a correction of MY OWN error. MOTIR-4011 already claimed the front-matter parity half — its criteria say "every document parses, every
versionmatches^\d+\.\d+\.\d+$, and every document has atitle", and its body says outright thatlegalVersionGuard.test.ts's "intent moves here with the documents". This card was filed while building MOTIR-4007 without reading that sibling's criteria, so two cards claimed one deliverable.What survives here is what MOTIR-4011 does NOT claim: the EXCLUSION-SET guard and the
REVIEWED_BASELINEtripwire. The parity rows in the table below are struck accordingly.Why the prior-art check did not catch it, stated so the next reader does not repeat it:
search_work_items_semanticwas run and ranked over 998 of 3831 items — the index covers about a quarter of the tree, and MOTIR-4011 was not in it. A semantic miss is not evidence of absence. The check that would have worked is the cheap one: read the sibling cards' CRITERIA under the same story, which is where a duplicate in the same subtree actually lives.
What was lost
motir-core tests/legal/legalVersionGuard.test.ts guarded the PUBLISHED legal set. Its subject — the seven documents — left for motir-marketing with MOTIR-4009, so the file was removed by MOTIR-4007 rather than left asserting over an empty manifest. Three of its assertions have no home in either repository now:
| assertion | still covered? |
|---|---|
<major>.<minor>.<patch> | ⚠️ NOT THIS CARD'S — MOTIR-4011 claims it. Its front-matter-parity guard is exactly this assertion |
| ⚠️ NOT THIS CARD'S — subsumed by MOTIR-4011's reachability + parity guards | |
the four documents consent.ts cites as EXCLUSIONS still exist | NO |
| no material revision has shipped past a reviewed baseline | NO — and this is the one with a promise behind it |
Why the fourth one matters most
The published Terms §14 promise that "we will not treat silence as agreement to a material change", and the mechanism that keeps it is a semver convention: a MAJOR or MINOR bump holds every signed-in reader, a PATCH does not. Nothing checks that an author bumped the component that matches what they actually changed.
The retired guard's answer was a REVIEWED_BASELINE pinned in the test — two independent values, so the suite went red the moment a material bump landed without somebody moving the baseline with it. Its own comment names the residual risk it does not reach (a material change shipped AS a patch) and accepts it, because only a human reading the diff can tell. What is gone is the prompt to read the diff at all.
motir-core can no longer carry it: it has no documents to read, and its manifest is the operator's configuration rather than an authored file with a reviewable diff. The repository that HAS the diff is motir-marketing.
⚠️ This is the SECOND guard this move stranded, which is the finding
MOTIR-4008 exists because the subprocessor guard's evidence (motir-core's own dependency tree) cannot follow the page. The story anticipated that one. The version guard is the same class and was not anticipated — its evidence is the document diff, which follows the page and lands in a repository that has no such guard.
The general shape, worth stating once: moving a document moves everything that guards its CONTENT and strands everything that guards its RELATIONSHIP to something that stayed. Two guards, two different halves of the same seam.
What this card should do
- Re-home the three lost assertions in
motir-marketing, overcontent/legal/, which is where the documents and their diffs now are. - Strengthen the version assertion from non-empty to PARSEABLE, with the same regex
motir-core'slib/legal/documents.tsvalidates the manifest against — the two are the same contract read from two sides, and a version that parses in one and not the other is precisely the drift worth catching. - Carry the
REVIEWED_BASELINEtripwire across, with the reviewed versions re-read from the documents as they stand at this card's base. - Keep the exclusion-set assertion: each of the four exclusions in
motir-corelib/legal/consent.tsquotes a ground published in one of those documents, so an exclusion whose source stopped existing is a reason that quietly outlived its citation.
Boundary
- It does not touch
motir-core. The manifest reader's own validation is MOTIR-4007's and shipped: a malformed entry is refused per entry, loudly, and/api/health/legalreports it. - It does not re-add a guard to
motir-core. There is nothing there to guard — the versions are configuration, not content. - It does not overlap MOTIR-4008, which re-homes the SUBPROCESSOR guard. Different guard, different evidence, same class.
Acceptance criteria
asserts every published document's— MOTIR-4011's, removed from this card 2026-09-02.versionPARSES- The three re-consent slugs (
terms,privacy,acceptable-use) are asserted present, and the four exclusion slugs (cookies,dpa,subprocessors,model-providers) are asserted present, each with the reason it is named. - A
REVIEWED_BASELINEtripwire is carried across, with its versions re-read at this card's own base rather than copied from this description, and the PR body quotes the read. - The suite is not vacuous: it asserts the document count is at least seven before iterating, so an empty or truncated read fails rather than passing having measured nothing.
- The PR body states, in one line, which assertions came from the retired
motir-coreguard and which are new.
Context refs
motir-marketing/content/legal/— the seven documents, and the diffs the tripwire exists to prompt a read ofmotir-marketing/tests/legal/legalDocuments.test.ts— the current, weaker assertion (version !== '')motir-core/lib/legal/consent.ts—RECONSENT_DOCUMENT_SLUGS,isMaterialChange, and the four exclusions with their published groundsmotir-core/lib/legal/documents.ts— the manifest's own^\d+\.\d+\.\d+$validation, the other side of the same contract- MOTIR-4007 — removed the guard;
relates_to - MOTIR-4008 — the same class, for the subprocessor guard
Advisory dispositions
- No
blocked_byis owed. This card's subject ismotir-marketing's owncontent/legal/, which MOTIR-3932 already shipped and which is on that repository'smaintoday. It reads nothing MOTIR-4007 or MOTIR-3909 produces. - The remaining
referenceadvisories name cards this one's Boundary excludes.