Skip to content

Commit a05b32f

Browse files
committed
fix(spec): the view-item D3 entry names the overlay pair as its own family
After #20255 landed, its view-item D3 entry still said a flattened overlay keeps its own owner/hidden. The overlay pair is a separate family with its own D2 view-overlay-owner-hidden-removed and D3 view-overlay-owner-hidden-retired. The overlay pin now reads another entry naming the conversion as a cross-reference that must point at this family's record. Claude-Session: https://claude.ai/code/session_01CiCTczDo7tGhafXjf61dUJ Co-authored-by: Claude <noreply@anthropic.com>
1 parent 2713d1b commit a05b32f

3 files changed

Lines changed: 15 additions & 7 deletions

File tree

‎packages/spec/src/migrations/entries/semantic/18.view-item-owner-hidden-retired.ts‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,9 @@ export const entry: SemanticMigration = {
2424
+ 'A view an author marked as one user\'s, or hid from the switcher, has always been listed to '
2525
+ 'every user who can read the object — its name, its columns, its filters and its sort. '
2626
+ 'Whether anything in such a view was meant to stay private, and whether it should now be '
27-
+ 'deleted rather than kept, is the author\'s call. A flattened view overlay keeps its own '
28-
+ '`owner` and `hidden`: those live on a different door that this retirement does not touch.',
27+
+ 'deleted rather than kept, is the author\'s call. A flattened view overlay\'s own `owner` and '
28+
+ '`hidden` are a separate family on a different door, with their own D2 conversion '
29+
+ '`view-overlay-owner-hidden-removed` and their own D3 entry `view-overlay-owner-hidden-retired`.',
2930
acceptanceCriteria: 'No view item record in `views` or in an assembled artifact carries `owner` or '
3031
+ '`hidden`; the parse refuses both by name, and an artifact assembled before the upgrade '
3132
+ 'registers without a refusal over them. For every view that had carried either key, the '

‎packages/spec/src/migrations/registry.ts‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15917,8 +15917,9 @@ const step18: MigrationStep = {
1591715917
+ 'A view an author marked as one user\'s, or hid from the switcher, has always been listed to '
1591815918
+ 'every user who can read the object — its name, its columns, its filters and its sort. '
1591915919
+ 'Whether anything in such a view was meant to stay private, and whether it should now be '
15920-
+ 'deleted rather than kept, is the author\'s call. A flattened view overlay keeps its own '
15921-
+ '`owner` and `hidden`: those live on a different door that this retirement does not touch.',
15920+
+ 'deleted rather than kept, is the author\'s call. A flattened view overlay\'s own `owner` and '
15921+
+ '`hidden` are a separate family on a different door, with their own D2 conversion '
15922+
+ '`view-overlay-owner-hidden-removed` and their own D3 entry `view-overlay-owner-hidden-retired`.',
1592215923
acceptanceCriteria: 'No view item record in `views` or in an assembled artifact carries `owner` or '
1592315924
+ '`hidden`; the parse refuses both by name, and an artifact assembled before the upgrade '
1592415925
+ 'registers without a refusal over them. For every view that had carried either key, the '

‎packages/spec/src/ui/view-overlay-owner-hidden-retirement.test.ts‎

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -343,8 +343,14 @@ describe('overlay owner/hidden retirement — ADR-0087 registration', () => {
343343
expect(entry.reason).toContain('Measured writers in this repository and its sibling UI: zero');
344344
expect(entry.reason).toContain('NOT MEASURED');
345345
expect(entry.acceptanceCriteria.length).toBeGreaterThan(0);
346-
// One family, one record: no other entry of the step claims this conversion.
347-
const claimants = semantic.filter((s) => JSON.stringify(s).includes('view-overlay-owner-hidden-removed'));
348-
expect(claimants.map((s) => s.id)).toEqual(['view-overlay-owner-hidden-retired']);
346+
// One family, one record. Another entry may NAME this conversion only as a
347+
// cross-reference that points at this record (the view item family's D3
348+
// entry does, to say the overlay pair is a separate family) — never as a
349+
// second record of its own.
350+
const naming = semantic.filter((s) => JSON.stringify(s).includes('view-overlay-owner-hidden-removed'));
351+
expect(naming.map((s) => s.id)).toContain('view-overlay-owner-hidden-retired');
352+
for (const other of naming.filter((s) => s.id !== 'view-overlay-owner-hidden-retired')) {
353+
expect(JSON.stringify(other), other.id).toContain('view-overlay-owner-hidden-retired');
354+
}
349355
});
350356
});

0 commit comments

Comments
 (0)