Skip to content
16 changes: 16 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

### Added

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

### Fixed

- V18 property projection review follow-up now preserves tolerant public
property-query misses, scopes targeted projection materialization to requested
owners, skips malformed edge-property projection entries, shares legacy
content key constants, and rejects class-instance property carriers.
- V18 content attachment projection now preserves existing same-patch metadata
lineage semantics when `_content`, `_content.mime`, and `_content.size` are
separate operations in one patch.
Expand Down
28 changes: 16 additions & 12 deletions docs/BEARING.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,14 +39,14 @@ of handwritten adapter folklore.

Current branch state at this boundary:

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

The current v18 graph-model posture is:

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

PR #98 landed the detailed design documents for slices 26 through 45 and
reset this bearing around the property-projection, migration dry-run, and
genesis-equivalence runway.

## What Feels Wrong

- Property reads still have direct raw legacy property interpretation in
places such as query reads and state-reader context code.
- Some non-query read surfaces still have direct raw legacy property
interpretation, especially state-reader context code.
- Generic property writes still lower directly to legacy property operations;
content writes are intent-backed, but property writes are not.
- Content persistence still uses legacy `_content*` compatibility properties.
Expand Down Expand Up @@ -160,15 +164,15 @@ and concrete checks live in `docs/invariants/`.
- [x] 23. Add content attachment projection.
- [x] 24. Route public content reads through content projection.
- [x] 25. Route content writes through typed write intent.
- [ ] 26. Reset the post-25 property projection runway:
- [x] 26. Reset the post-25 property projection runway:
[0174](design/0174-v18-post-25-property-projection-runway/v18-post-25-property-projection-runway.md).
- [ ] 27. Add legacy property projection nouns:
- [x] 27. Add legacy property projection nouns:
[0175](design/0175-v18-legacy-property-projection-nouns/v18-legacy-property-projection-nouns.md).
- [ ] 28. Add node property projection:
- [x] 28. Add node property projection:
[0176](design/0176-v18-node-property-projection/v18-node-property-projection.md).
- [ ] 29. Add edge property projection:
- [x] 29. Add edge property projection:
[0177](design/0177-v18-edge-property-projection/v18-edge-property-projection.md).
- [ ] 30. Route query property reads through projection:
- [x] 30. Route query property reads through projection:
[0178](design/0178-v18-query-property-projection-reads/v18-query-property-projection-reads.md).
- [ ] 31. Route state-reader property views through projection:
[0179](design/0179-v18-state-reader-property-projection/v18-state-reader-property-projection.md).
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
---
cycle: 0174
task_id: V18_post_25_property_projection_runway
status: Planned
status: Complete
sponsors:
human: James
agent: Codex
started_at: 2026-05-23
completed_at: 2026-05-23
release_home: v18.0.0
bearing_task: 26
promotes_backlog:
Expand Down Expand Up @@ -84,8 +85,8 @@ work needed to make that claim later.

## RED Plan

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

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

## GREEN Plan

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

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

Observed on closeout:

```text
npx markdownlint-cli2 CHANGELOG.md docs/BEARING.md docs/design/0174-v18-post-25-property-projection-runway/v18-post-25-property-projection-runway.md
Summary: 0 error(s)

git diff --check HEAD
```

## Closeout Criteria

- `BEARING.md` names the current merged PR #97 state.
- `BEARING.md` names the current merged PR #98 state.
- Slices 26 through 45 are listed and linked.
- Each planned slice has a design document.
- The changelog records the planning update under `Unreleased`.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
---
cycle: 0175
task_id: V18_legacy_property_projection_nouns
status: Planned
status: Complete
sponsors:
human: James
agent: Codex
started_at: 2026-05-23
completed_at: 2026-05-23
release_home: v18.0.0
bearing_task: 27
promotes_backlog:
Expand Down Expand Up @@ -80,22 +81,29 @@ hide or preserve them for the public property API.

## RED Plan

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

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

Observed RED:

```text
npx vitest run test/unit/domain/graph/LegacyPropertyProjection.test.ts --reporter=verbose
Error: Cannot find module '../../../../src/domain/graph/LegacyEdgePropertyKey.ts'
```

## GREEN Plan

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

Export the nouns through the graph substrate public surface only after tests
prove the intended construction and read behavior.
The nouns are exported through the graph substrate public surface after tests
proved the intended construction and read behavior.

## Verification

Expand All @@ -107,6 +115,19 @@ npm run lint:sludge
git diff --check HEAD
```

Observed GREEN:

```text
npx vitest run test/unit/domain/graph/LegacyPropertyProjection.test.ts --reporter=verbose
Test Files 1 passed (1)
Tests 5 passed (5)

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

npm run typecheck
npm run lint:sludge
```

## Closeout Criteria

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

## SSJS Scorecard

- Runtime-backed forms: green when each property concept is a frozen class.
- Boundary validation: green when raw keys are decoded once and invalid keys
fail closed.
- Behavior ownership: green when key classification lives with the projection.
- Runtime-backed forms: green; each property concept is a frozen class.
- Boundary validation: green; raw key values are validated by property key
nouns.
- Behavior ownership: green; key classification lives with the key noun
concept.
- Message parsing: green; no behavior branches on diagnostics.
- Ambient time or entropy: green; no clocks or randomness.
- Fake shape trust or cast-cosplay: green when no assertions or placeholder
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
---
cycle: 0176
task_id: V18_node_property_projection
status: Planned
status: Complete
sponsors:
human: James
agent: Codex
started_at: 2026-05-23
completed_at: 2026-05-23
release_home: v18.0.0
bearing_task: 28
promotes_backlog:
Expand Down Expand Up @@ -77,33 +78,52 @@ lower records back to the existing public object shape.

## RED Plan

Add tests that currently fail without the projection:
Added tests that failed without the projection:

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

Observed RED:

```text
npx vitest run test/unit/domain/services/NodePropertyProjection.test.ts --reporter=verbose
Error: Cannot find module '../../../../src/domain/services/NodePropertyProjection.ts'
```

## GREEN Plan

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

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

## Verification

```text
npx vitest run test/unit/domain/graph/NodePropertyProjection.test.ts --reporter=verbose
npx eslint src/domain/graph test/unit/domain/graph/NodePropertyProjection.test.ts
npx vitest run test/unit/domain/services/NodePropertyProjection.test.ts --reporter=verbose
npx eslint src/domain/services/NodePropertyProjection.ts test/unit/domain/services/NodePropertyProjection.test.ts
npm run typecheck
npm run lint:sludge
git diff --check HEAD
```

Observed GREEN:

```text
npx vitest run test/unit/domain/services/NodePropertyProjection.test.ts --reporter=verbose
Test Files 1 passed (1)
Tests 4 passed (4)

npx eslint src/domain/services/NodePropertyProjection.ts test/unit/domain/services/NodePropertyProjection.test.ts

npm run typecheck
npm run lint:sludge
```

## Closeout Criteria

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

## SSJS Scorecard

- Runtime-backed forms: green when visible node properties are records, not
raw object fragments.
- Boundary validation: green when legacy key decoding happens at projection
entry.
- Behavior ownership: green when node visibility and property classification
belong to the projection.
- Runtime-backed forms: green; visible node properties are records, not raw
object fragments.
- Boundary validation: green; legacy key decoding happens at projection entry.
- Behavior ownership: green; node visibility belongs to `WarpState` and
property classification belongs to the property key noun.
- Message parsing: green; no message-string branching.
- Ambient time or entropy: green; no clock or random source.
- Fake shape trust or cast-cosplay: green when no assertions are needed.
Loading
Loading