Repository navigation
fix(spec): the mailAssociation liveness row goes live — the mailbox matcher reads it, so the stale author warning is dropped - #23314
Conversation
…atcher reads it
The row was planned + authorWarn until the mailbox service's matcher existed.
The matcher (service-mailbox src/ingest/match-records.ts, MailRecordMatcher)
reads every email field declaring mailAssociation: true at ingest and at
re-match, so the author hint ("no mailbox service reads this yet") is false.
Flip to live, cite the matcher, drop authorWarn and authorHint, follow the
authorWarnedProperties('field') pin and regenerate the field state counts
(94 live / 4 planned -> 95 / 3).
Claude-Session: https://claude.ai/code/session_012uFegdfR6K6uqvLzt7XsdZ
Co-authored-by: Claude <noreply@anthropic.com>
…ger ships in the spec tarball) Claude-Session: https://claude.ai/code/session_012uFegdfR6K6uqvLzt7XsdZ Co-authored-by: Claude <noreply@anthropic.com>
📓 Docs Drift Check
What this run could not see
Coarse fallback — 142 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
The note now says the reader is stage 1 of #22871 (the ingest seam and the matcher, landed at 8258181) and names the IMAP connector and the mailbox sync as the card's second stage, which feeds that same seam, without claiming it has landed. status, verifiedAt and evidence are byte-identical; no PR number is named. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012uFegdfR6K6uqvLzt7XsdZ
Contract reviewServed-tier: PR #23314 ( ① Derived judgments
② Semver level
③ Boundary flags
Implemented-by: VERDICT: PASS |
#23314 landed the mailAssociation liveness flip as 777eed2 with the trimmed note; the one conflicting line, that row's note in packages/spec/liveness/field.json, is resolved to main's side, so this branch's flip commit is a no-op against main. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012uFegdfR6K6uqvLzt7XsdZ
Part of #22871
Clause-②: no (dropping an author warning widens no accept set and no published surface:
FieldSchemaacceptsmailAssociationexactly as before, and no export, key or default changes; the shipped liveness ledger loses oneauthorWarnrow, soos lintstops warning on the key)The
mailAssociationliveness row goeslive, on its own PRThis is stage 2's carried item 1 on #22871, split off under the seat's answer
6151023438and claim amendment6151040021.610e112bdfrom PR feat(connector-imap, service-mailbox): the IMAP mail source — a read-only IMAP connector and the mailbox sync that feeds the ingest seam #23303, cherry-picked ontomainat280806912:packages/spec/liveness/field.json,packages/spec/liveness/state-counts/field.mdandpackages/lint/src/lint-liveness-properties.test.ts. The cherry-picked change lines are identical to the original's (compared as diffs).liveness/ships in the@objectstack/spectarball (files).mainsince the stage-1 matcher landed at82581819b. PR feat(connector-imap, service-mailbox): the IMAP mail source — a read-only IMAP connector and the mailbox sync that feeds the ingest seam #23303 (3690 lines) waits for a human merge, and this hint must not ship in a release.The change
field.json:mailAssociationmoves fromplannedwithauthorWarnandauthorHinttolive.packages/services/service-mailbox/src/ingest/match-records.ts#MailRecordMatcher, onmainsince82581819b. Itsmatchreads everyemailfield declaringmailAssociation: true, throughflaggedFieldsOf.#MailRecordMatcher.match, becausecheck:livenessrefuses a dotted anchor.authorWarnedProperties('field')becomes['conditionalRequired'].state-counts/field.md: 94 live and 4 planned become 95 live and 3 planned. The file is regenerated bygen:liveness-counts.Why
Clause-②: noThe declaration asks whether the change widens an accept set or the public surface.
FieldSchema's refine is unchanged: the key was accepted onemailand refused elsewhere before this PR, and it still is.os lintreads, so an author who writes the key stops being warned that nothing reads it. That narrows a warning; it accepts nothing new.'@objectstack/spec': patchwithClause-②: no.Verification at the PR head
All of this ran at
4d4fac733, onmain280806912, underos-verify-lock(one call,VERDICT command-exit 0):pnpm turbo run build --concurrency=2 --filter=!@objectstack/docs(74 of 74 tasks);pnpm --filter @objectstack/spec check:liveness, which exits 0. Everypath#symbolanchor resolves, andstate-counts/is current;pnpm --filter @objectstack/lint exec vitest run --maxWorkers=2 src/lint-liveness-properties.test.ts: 100 passed;pnpm --filter @objectstack/spec test:repo: 58 files, 1007 passed.Gates.
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderives 71 families. All 71 were run, one log each, with exit codes captured before any pipe, and--ranreconciles: "71 derived, 71 run, 0 NOT-MEASURED, 0 UNRUN".check:adr-0087-registration,check:changeset-no-major,check:empty-changeset,check:generated,check:livenessandcheck:published-files.pnpm check:platform-checklistexits 1, with the same 8 findingsmainshows. This diff touches none of its inputs (docs/qa/**,metadata-protocol,service-storage, the anchor scripts), so the red ismain's.Notes
610e112bd. Once this lands, mergingmaininto it is a no-op for these three files.notesays the reader landed "in two stages of connector-imap + minimal service-mailbox: shared-mailbox (forward/BCC) ingest intosys_mail_message, associated at ingest through the seam — phase 1 of #8998 inbound mail #22871 … then the IMAP connector … and the mailbox sync". The second half is true only once PR feat(connector-imap, service-mailbox): the IMAP mail source — a read-only IMAP connector and the mailbox sync that feeds the ingest seam #23303 lands. This PR carries the commit exactly, as ordered; the seat decides whether that sentence is trimmed here.Generated by Claude Code