Pin CultLib abd1a92e; [CultRole] audit; ElementId on every list element type #35

Merged
aqua merged 4 commits from aqua/cultindex-audit into main 2026-11-11 08:31:23 +00:00
Member

Audit for CultLib #90/#91: pin moved to CultLib abd1a92e (floor 7760219b), 15 many-row members are [CultRole], 7 receipt CommandIds stay [CultIndex("command")] (key injective in CommandId).

Pin move. Directory.Build.props and README name abd1a92eb24e1af3fc7cdd1bf98a88dbdebc2938.

Element ids. Found by registering every document type (28) and by a reflection walk: 11 list element types lacked [CultElementId]: AutomationControlFrame, AutomationPacketReceipt, CultMeshStreamDescriptor, CultCachePatchDatabaseEntry, PatchClaimCard, SpeechClaimCard, PrimitiveTimelineFact, SpeechScoreMetric, SpeechRenderArtifact, SpeechTimingReceipt, SpeechWorkerPayloadArtifact. Each gets a trailing keyed ElementId (default empty; minted on write). Derived (readable) from the natural unique key where the producer guarantees one: Packet from Sequence, StreamDescriptor from StreamId, DatabaseEntry from Path, claim cards from Id. Wire is additive; positional constructors unchanged.

Tests. ElementIdTests: a store written by the previous pin (fixture Fixtures/CultCache/pre-element-ids.cc, 10-field rows without ids) reopens with stable unique ids, keeps them across an unrelated write, derived ids on a new write. CultIndexUniquenessTests shares role values across daemon documents. Targeted classes pass; the full suite does not finish here (PackageBoundaryTests hang in this sandbox, 381 others pass). Two failures, ZynAddSubFxReferenceSourceIsPinnedForTestOnlyParity and CultMeshLeasedWorkersScoreButAuthorityTrainerAppliesCheckpoint, fail identically on main at the old pin.

Separate-context Soul pass at 5d03490f: all claims hold, no producer would throw on a derived id; it found the StreamId derivation unpinned, which the last commit pins. Rollback note: a store written at the new pin (header v3 with ids) is not readable by the old pin.

🤖 Generated with Claude Code

Audit for CultLib #90/#91: pin moved to CultLib abd1a92e (floor 7760219b), 15 many-row members are [CultRole], 7 receipt CommandIds stay [CultIndex("command")] (key injective in CommandId). **Pin move.** Directory.Build.props and README name abd1a92eb24e1af3fc7cdd1bf98a88dbdebc2938. **Element ids.** Found by registering every document type (28) and by a reflection walk: 11 list element types lacked [CultElementId]: AutomationControlFrame, AutomationPacketReceipt, CultMeshStreamDescriptor, CultCachePatchDatabaseEntry, PatchClaimCard, SpeechClaimCard, PrimitiveTimelineFact, SpeechScoreMetric, SpeechRenderArtifact, SpeechTimingReceipt, SpeechWorkerPayloadArtifact. Each gets a trailing keyed `ElementId` (default empty; minted on write). Derived (readable) from the natural unique key where the producer guarantees one: Packet from Sequence, StreamDescriptor from StreamId, DatabaseEntry from Path, claim cards from Id. Wire is additive; positional constructors unchanged. **Tests.** ElementIdTests: a store written by the previous pin (fixture `Fixtures/CultCache/pre-element-ids.cc`, 10-field rows without ids) reopens with stable unique ids, keeps them across an unrelated write, derived ids on a new write. CultIndexUniquenessTests shares role values across daemon documents. Targeted classes pass; the full suite does not finish here (PackageBoundaryTests hang in this sandbox, 381 others pass). Two failures, ZynAddSubFxReferenceSourceIsPinnedForTestOnlyParity and CultMeshLeasedWorkersScoreButAuthorityTrainerAppliesCheckpoint, fail identically on main at the old pin. Separate-context Soul pass at 5d03490f: all claims hold, no producer would throw on a derived id; it found the StreamId derivation unpinned, which the last commit pins. Rollback note: a store written at the new pin (header v3 with ids) is not readable by the old pin. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
CultLib #90 makes [CultIndex] unique at commit and load. The daemon's PatchId and SessionId
members, and the speech store's RequestId and PayloadId, are shared by many rows, so they
become [CultRole]; the CommandId of each receipt stays [CultIndex] (a receipt's key derives
from its CommandId alone). Needs CultLib >= 7760219b: does not build at the 42dce361 pin.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
CultLib 7760219b+ registers a document only if each list element class has a [CultElementId] string member.
Found by registering every document type: AutomationControlFrame, AutomationPacketReceipt, CultMeshStreamDescriptor,
CultCachePatchDatabaseEntry, PatchClaimCard, SpeechClaimCard, PrimitiveTimelineFact, SpeechScoreMetric, SpeechRenderArtifact,
SpeechTimingReceipt, SpeechWorkerPayloadArtifact. Each gets a trailing keyed ElementId (default empty, minted on write; derived
from Path/Id/StreamId/Sequence where the type already has a unique natural key). Wire is additive.
Tests: a store written by the 42dce361 pin (fixture) reopens with stable unique ids and survives a write; derived packet ids.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
aqua changed title from [CultIndex] audit for CultLib #90: many-row members become [CultRole] (needs the pin move) to Pin CultLib abd1a92e; [CultRole] audit; ElementId on every list element type 2026-11-11 08:31:22 +00:00
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
aqua merged commit 5c49f2ae86 into main 2026-11-11 08:31:23 +00:00
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
GameCult/AquaSynth!35
No description provided.