Skip to content

Commit 7d6cf66

Browse files
authored
Merge pull request #99 from git-stunts/v18-continuum-slices-26-30
Implement v18 property projection reads
2 parents c66f1a4 + f88e1d2 commit 7d6cf66

27 files changed

Lines changed: 1751 additions & 149 deletions

CHANGELOG.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
99

1010
### Added
1111

12+
- V18 query reads now route linear node property reads, edge property reads,
13+
and edge-list property payloads through projection-backed compatibility
14+
records instead of decoding raw property keys in the query controller.
15+
- V18 legacy property projection now exposes `EdgePropertyProjection`, a
16+
deterministic read projection from visible `WarpState` edge properties to
17+
runtime-backed compatibility records with edge-birth filtering.
18+
- V18 legacy property projection now exposes `NodePropertyProjection`, a
19+
deterministic read projection from visible `WarpState` node properties to
20+
runtime-backed compatibility records.
21+
- V18 legacy property projection now exposes runtime-backed node property key,
22+
edge property key, property value, visible node property record, visible
23+
edge property record, and projection collection nouns.
1224
- V18 planning now records detailed design documents for slices 26 through 45,
1325
covering legacy property projection, property write intents, graph-model
1426
migration dry-run tooling, genesis replay equivalence, and the next
@@ -58,6 +70,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
5870

5971
### Fixed
6072

73+
- V18 property projection review follow-up now preserves tolerant public
74+
property-query misses, scopes targeted projection materialization to requested
75+
owners, skips malformed edge-property projection entries, shares legacy
76+
content key constants, and rejects class-instance property carriers.
6177
- V18 content attachment projection now preserves existing same-patch metadata
6278
lineage semantics when `_content`, `_content.mime`, and `_content.size` are
6379
separate operations in one patch.

docs/BEARING.md

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -39,14 +39,14 @@ of handwritten adapter folklore.
3939

4040
Current branch state at this boundary:
4141

42-
- Branch: `v18-continuum-slices-26-45-design`
42+
- Branch: `v18-continuum-slices-26-30`
4343
- Base branch: `main`
44-
- Current `origin/main`: `e288c113`
45-
- Latest merged PR: #97, v18 Continuum slices 21 through 25
44+
- Current `origin/main`: `c66f1a49`
45+
- Latest merged PR: #98, v18 design documents for slices 26 through 45
4646
- Latest released package line: `17.0.1`
4747
- Latest completed implementation cycle:
48-
`0173-v18-content-write-intent-cutover`
49-
- Current work: documentation-only planning for slices 26 through 45
48+
`0178-v18-query-property-projection-reads`
49+
- Current work: implementation branch `v18-continuum-slices-26-30`
5050

5151
The current v18 graph-model posture is:
5252

@@ -79,10 +79,14 @@ PRs #94 through #96 had already landed the earlier v18 evidence posture,
7979
generated-family readiness, runtime-boundary source facts, node and edge
8080
records, generic attachment substrate, and graph-op algebra groundwork.
8181

82+
PR #98 landed the detailed design documents for slices 26 through 45 and
83+
reset this bearing around the property-projection, migration dry-run, and
84+
genesis-equivalence runway.
85+
8286
## What Feels Wrong
8387

84-
- Property reads still have direct raw legacy property interpretation in
85-
places such as query reads and state-reader context code.
88+
- Some non-query read surfaces still have direct raw legacy property
89+
interpretation, especially state-reader context code.
8690
- Generic property writes still lower directly to legacy property operations;
8791
content writes are intent-backed, but property writes are not.
8892
- Content persistence still uses legacy `_content*` compatibility properties.
@@ -160,15 +164,15 @@ and concrete checks live in `docs/invariants/`.
160164
- [x] 23. Add content attachment projection.
161165
- [x] 24. Route public content reads through content projection.
162166
- [x] 25. Route content writes through typed write intent.
163-
- [ ] 26. Reset the post-25 property projection runway:
167+
- [x] 26. Reset the post-25 property projection runway:
164168
[0174](design/0174-v18-post-25-property-projection-runway/v18-post-25-property-projection-runway.md).
165-
- [ ] 27. Add legacy property projection nouns:
169+
- [x] 27. Add legacy property projection nouns:
166170
[0175](design/0175-v18-legacy-property-projection-nouns/v18-legacy-property-projection-nouns.md).
167-
- [ ] 28. Add node property projection:
171+
- [x] 28. Add node property projection:
168172
[0176](design/0176-v18-node-property-projection/v18-node-property-projection.md).
169-
- [ ] 29. Add edge property projection:
173+
- [x] 29. Add edge property projection:
170174
[0177](design/0177-v18-edge-property-projection/v18-edge-property-projection.md).
171-
- [ ] 30. Route query property reads through projection:
175+
- [x] 30. Route query property reads through projection:
172176
[0178](design/0178-v18-query-property-projection-reads/v18-query-property-projection-reads.md).
173177
- [ ] 31. Route state-reader property views through projection:
174178
[0179](design/0179-v18-state-reader-property-projection/v18-state-reader-property-projection.md).

docs/design/0174-v18-post-25-property-projection-runway/v18-post-25-property-projection-runway.md

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
---
22
cycle: 0174
33
task_id: V18_post_25_property_projection_runway
4-
status: Planned
4+
status: Complete
55
sponsors:
66
human: James
77
agent: Codex
88
started_at: 2026-05-23
9+
completed_at: 2026-05-23
910
release_home: v18.0.0
1011
bearing_task: 26
1112
promotes_backlog:
@@ -84,8 +85,8 @@ work needed to make that claim later.
8485

8586
## RED Plan
8687

87-
No regression test is required for the documentation-only slice. The failure
88-
condition is stale or missing planning evidence:
88+
No regression test was required for the documentation-only slice. The failure
89+
condition was stale or missing planning evidence:
8990

9091
- `BEARING.md` still describes the pre-PR-97 branch;
9192
- slices 26 through 45 are not all represented by design documents;
@@ -94,9 +95,9 @@ condition is stale or missing planning evidence:
9495

9596
## GREEN Plan
9697

97-
Add one design file for each slice from 26 through 45. Rewrite `BEARING.md`
98-
around the current main-line state, the merged slice-21-through-25 work, and
99-
the next twenty planned moves.
98+
One design file now exists for each slice from 26 through 45. `BEARING.md`
99+
was rewritten around the current main-line state, the merged
100+
slice-21-through-25 work, and the next twenty planned moves.
100101

101102
The text must describe property bags as compatibility views and graph
102103
attachments as the emerging substrate. It must also preserve the honest
@@ -110,9 +111,18 @@ npx markdownlint-cli2 CHANGELOG.md docs/BEARING.md docs/design/0174-v18-post-25-
110111
git diff --check HEAD
111112
```
112113

114+
Observed on closeout:
115+
116+
```text
117+
npx markdownlint-cli2 CHANGELOG.md docs/BEARING.md docs/design/0174-v18-post-25-property-projection-runway/v18-post-25-property-projection-runway.md
118+
Summary: 0 error(s)
119+
120+
git diff --check HEAD
121+
```
122+
113123
## Closeout Criteria
114124

115-
- `BEARING.md` names the current merged PR #97 state.
125+
- `BEARING.md` names the current merged PR #98 state.
116126
- Slices 26 through 45 are listed and linked.
117127
- Each planned slice has a design document.
118128
- The changelog records the planning update under `Unreleased`.

docs/design/0175-v18-legacy-property-projection-nouns/v18-legacy-property-projection-nouns.md

Lines changed: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
---
22
cycle: 0175
33
task_id: V18_legacy_property_projection_nouns
4-
status: Planned
4+
status: Complete
55
sponsors:
66
human: James
77
agent: Codex
88
started_at: 2026-05-23
9+
completed_at: 2026-05-23
910
release_home: v18.0.0
1011
bearing_task: 27
1112
promotes_backlog:
@@ -80,22 +81,29 @@ hide or preserve them for the public property API.
8081

8182
## RED Plan
8283

83-
Add tests that fail because no runtime-backed projection nouns exist:
84+
Added tests that failed because no runtime-backed projection nouns existed:
8485

8586
- constructing a node property record from a malformed node id fails;
8687
- constructing an edge property record from malformed edge coordinates fails;
8788
- content compatibility keys are classified deterministically;
8889
- property records expose owner, key, and value without exposing mutable
8990
carrier objects.
9091

92+
Observed RED:
93+
94+
```text
95+
npx vitest run test/unit/domain/graph/LegacyPropertyProjection.test.ts --reporter=verbose
96+
Error: Cannot find module '../../../../src/domain/graph/LegacyEdgePropertyKey.ts'
97+
```
98+
9199
## GREEN Plan
92100

93-
Create one file per concept. Constructors validate the smallest possible
101+
Created one file per concept. Constructors validate the smallest possible
94102
runtime boundary and freeze instances. Dispatch uses `instanceof` where the
95103
code needs to distinguish node and edge property records.
96104

97-
Export the nouns through the graph substrate public surface only after tests
98-
prove the intended construction and read behavior.
105+
The nouns are exported through the graph substrate public surface after tests
106+
proved the intended construction and read behavior.
99107

100108
## Verification
101109

@@ -107,6 +115,19 @@ npm run lint:sludge
107115
git diff --check HEAD
108116
```
109117

118+
Observed GREEN:
119+
120+
```text
121+
npx vitest run test/unit/domain/graph/LegacyPropertyProjection.test.ts --reporter=verbose
122+
Test Files 1 passed (1)
123+
Tests 5 passed (5)
124+
125+
npx eslint src/domain/graph/LegacyPropertyKeyClassification.ts src/domain/graph/LegacyNodePropertyKey.ts src/domain/graph/LegacyEdgePropertyKey.ts src/domain/graph/LegacyPropertyValue.ts src/domain/graph/VisibleNodePropertyRecord.ts src/domain/graph/VisibleEdgePropertyRecord.ts src/domain/graph/LegacyPropertyProjection.ts src/domain/graph/publicGraphSubstrate.ts test/unit/domain/graph/LegacyPropertyProjection.test.ts
126+
127+
npm run typecheck
128+
npm run lint:sludge
129+
```
130+
110131
## Closeout Criteria
111132

112133
- Property compatibility has named runtime forms.
@@ -116,10 +137,11 @@ git diff --check HEAD
116137

117138
## SSJS Scorecard
118139

119-
- Runtime-backed forms: green when each property concept is a frozen class.
120-
- Boundary validation: green when raw keys are decoded once and invalid keys
121-
fail closed.
122-
- Behavior ownership: green when key classification lives with the projection.
140+
- Runtime-backed forms: green; each property concept is a frozen class.
141+
- Boundary validation: green; raw key values are validated by property key
142+
nouns.
143+
- Behavior ownership: green; key classification lives with the key noun
144+
concept.
123145
- Message parsing: green; no behavior branches on diagnostics.
124146
- Ambient time or entropy: green; no clocks or randomness.
125147
- Fake shape trust or cast-cosplay: green when no assertions or placeholder

docs/design/0176-v18-node-property-projection/v18-node-property-projection.md

Lines changed: 34 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
---
22
cycle: 0176
33
task_id: V18_node_property_projection
4-
status: Planned
4+
status: Complete
55
sponsors:
66
human: James
77
agent: Codex
88
started_at: 2026-05-23
9+
completed_at: 2026-05-23
910
release_home: v18.0.0
1011
bearing_task: 28
1112
promotes_backlog:
@@ -77,33 +78,52 @@ lower records back to the existing public object shape.
7778

7879
## RED Plan
7980

80-
Add tests that currently fail without the projection:
81+
Added tests that failed without the projection:
8182

8283
- a live node with two properties projects two immutable records;
8384
- a removed node's property register does not appear;
8485
- malformed or edge-shaped property keys are rejected or ignored according to
8586
the existing visible-state policy;
8687
- content compatibility keys are classified consistently.
8788

89+
Observed RED:
90+
91+
```text
92+
npx vitest run test/unit/domain/services/NodePropertyProjection.test.ts --reporter=verbose
93+
Error: Cannot find module '../../../../src/domain/services/NodePropertyProjection.ts'
94+
```
95+
8896
## GREEN Plan
8997

90-
Implement a small projection object or service with explicit methods such as
91-
`projectVisibleNodeProperties(state)`. Keep supporting helpers private and
92-
concept-named. Avoid a `utils` file.
98+
Implemented `NodePropertyProjection` with explicit `fromState()` and
99+
`forNode()` methods. Supporting functions stay private and concept-named.
93100

94-
The implementation should reuse existing node-record projection rather than
95-
recomputing node liveness in a second ad hoc way.
101+
The implementation reuses `WarpState.getNodeRecord()` for node liveness
102+
instead of recomputing liveness in a second ad hoc way.
96103

97104
## Verification
98105

99106
```text
100-
npx vitest run test/unit/domain/graph/NodePropertyProjection.test.ts --reporter=verbose
101-
npx eslint src/domain/graph test/unit/domain/graph/NodePropertyProjection.test.ts
107+
npx vitest run test/unit/domain/services/NodePropertyProjection.test.ts --reporter=verbose
108+
npx eslint src/domain/services/NodePropertyProjection.ts test/unit/domain/services/NodePropertyProjection.test.ts
102109
npm run typecheck
103110
npm run lint:sludge
104111
git diff --check HEAD
105112
```
106113

114+
Observed GREEN:
115+
116+
```text
117+
npx vitest run test/unit/domain/services/NodePropertyProjection.test.ts --reporter=verbose
118+
Test Files 1 passed (1)
119+
Tests 4 passed (4)
120+
121+
npx eslint src/domain/services/NodePropertyProjection.ts test/unit/domain/services/NodePropertyProjection.test.ts
122+
123+
npm run typecheck
124+
npm run lint:sludge
125+
```
126+
107127
## Closeout Criteria
108128

109129
- Visible node property projection exists as a named domain service.
@@ -113,12 +133,11 @@ git diff --check HEAD
113133

114134
## SSJS Scorecard
115135

116-
- Runtime-backed forms: green when visible node properties are records, not
117-
raw object fragments.
118-
- Boundary validation: green when legacy key decoding happens at projection
119-
entry.
120-
- Behavior ownership: green when node visibility and property classification
121-
belong to the projection.
136+
- Runtime-backed forms: green; visible node properties are records, not raw
137+
object fragments.
138+
- Boundary validation: green; legacy key decoding happens at projection entry.
139+
- Behavior ownership: green; node visibility belongs to `WarpState` and
140+
property classification belongs to the property key noun.
122141
- Message parsing: green; no message-string branching.
123142
- Ambient time or entropy: green; no clock or random source.
124143
- Fake shape trust or cast-cosplay: green when no assertions are needed.

0 commit comments

Comments
 (0)