Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
103 commits
Select commit Hold shift + click to select a range
aea3d10
feat(schemas): add spoke-memory data models
auto-wood Oct 28, 2026
e4f8adf
fix(schemas): enforce content lifecycle and chunk extension round-trip
auto-wood Oct 28, 2026
9625b02
feat(schemas): add spoke-memory op wire schemas
auto-wood Oct 28, 2026
c4a0369
fix(schemas): constrain memory op receipts, retry classes, and key bo…
auto-wood Oct 28, 2026
621dec9
fix(schemas): constrain receipts-get polling to per-op receipt shapes
auto-wood Oct 28, 2026
ee4e8a0
fix(schemas): dedupe receipts-get per-op receipt branches via respons…
auto-wood Oct 28, 2026
0f1f728
feat(schemas): generate spoke-memory TS/Rust types
auto-wood Oct 28, 2026
8214e9b
fix(schemas): restore retry-class mapping enforcement and drop experi…
auto-wood Oct 28, 2026
cd7bdd1
fix(schemas): allow unknown error codes with valid retry class; pin i…
auto-wood Oct 28, 2026
a113ec4
fix(schemas): guard codegen hoist names and require idempotency-key echo
auto-wood Oct 28, 2026
10df7ae
fix(schemas): require idempotency-key echo on pending and failed poll…
auto-wood Oct 28, 2026
a22fd5f
chore(merge): integrate p1-memory-wire-schemas into iteration/v0.15-m…
auto-wood Oct 28, 2026
7cb4227
feat(operations): memory port trait and reject codes (rust)
auto-wood Oct 28, 2026
44547ff
feat(operations): memory validators, grant coverage, digests (rust)
auto-wood Oct 28, 2026
d5013d9
fix(operations): enforce admin-only single-grant issuance and limit d…
auto-wood Oct 28, 2026
40484f9
fix(operations): bound grant issuance by earliest applicable admin ex…
auto-wood Oct 28, 2026
2b3bf50
fix(operations): scope grant expiry bound to applicable admin grants
auto-wood Oct 28, 2026
d035d1e
feat(operations): memory port + validators (ts)
auto-wood Oct 28, 2026
dd5d101
fix(operations): accept combined record updates and fail closed on ma…
auto-wood Oct 28, 2026
43c8dae
fix(operations): tighten ts pagination, timestamp grammar, and expiry…
auto-wood Oct 28, 2026
29e468f
chore(operations): drop residual self-counting assertion
auto-wood Oct 28, 2026
0b43b75
chore(merge): integrate p2-memory-operations into iteration/v0.15-memory
auto-wood Oct 28, 2026
4983386
feat(memory): spoke-memory crate skeleton
auto-wood Oct 28, 2026
3712267
feat(memory): classify and recall policy
auto-wood Oct 28, 2026
2802c7d
fix(memory): measure recall budget over serialized content
auto-wood Oct 28, 2026
e3249d0
feat(memory): reflection basis and transfer policy
auto-wood Oct 28, 2026
81beee9
fix(memory): correct transfer digest, chunking, and translation seman…
auto-wood Oct 28, 2026
8d862fe
fix(memory): es6-correct number canonicalization via ryu
auto-wood Oct 28, 2026
711df8c
fix(schemas): disambiguate candidate proposed-shape titles
auto-wood Oct 28, 2026
8b9cddf
fix(connect): adapt to regenerated response types
auto-wood Oct 28, 2026
c41dcbc
fix(memory): defer the ranked tail at the byte budget boundary
auto-wood Oct 28, 2026
554120f
chore(merge): integrate p3-memory-engine into iteration/v0.15-memory
auto-wood Oct 28, 2026
35efed1
feat(connect): memory dispatch rows and capability flags
auto-wood Oct 28, 2026
4961f3f
feat(connect): remote memory service and responder arms
auto-wood Oct 28, 2026
cebef0f
fix(connect): optional memory face, typed port delegation, enforcing …
auto-wood Oct 28, 2026
b983505
fix(connect): close fixture authorization and digest gaps
auto-wood Oct 28, 2026
a8a6e29
fix(connect): enforce review space addressing and valid shared-covera…
auto-wood Oct 28, 2026
95fd693
fix(schemas): make committed-receipt response types constructible
auto-wood Oct 28, 2026
5f66985
test(schemas): isolate the committed-with-error prohibition
auto-wood Oct 28, 2026
5d17db7
feat(connect): memory client adapters and golden vectors
auto-wood Oct 28, 2026
05c943b
fix(connect): per-op poll branches, adapter-exercised golden vectors,…
auto-wood Oct 28, 2026
cefbfc0
fix(connect): ts imports.stage adapter coverage and rust principal as…
auto-wood Oct 28, 2026
f5d1391
fix(connect): memory deny classifications and uncertain timeout seman…
auto-wood Oct 28, 2026
dc8b276
chore(merge): integrate p4-memory-connect into iteration/v0.15-memory
auto-wood Oct 28, 2026
75d1701
test(memory): toy-world memory fixtures and scenarios
auto-wood Oct 28, 2026
7d6f581
docs(memory): normative spoke-memory spec and ADR
auto-wood Oct 28, 2026
549b21e
docs(memory): correct spec contract exceptions and registration counts
auto-wood Oct 28, 2026
60d327b
fix(memory): correct recall overflow_record_id fixture semantics
auto-wood Oct 28, 2026
77d0f71
docs(memory): scope chunk and capture limits precisely
auto-wood Oct 28, 2026
0b61fd6
docs(memory): amend author-memory boundary statements
auto-wood Oct 28, 2026
cf7e518
test(memory): conformance vectors and engine runner
auto-wood Oct 28, 2026
6ccf556
fix(memory): correct conformance corpus paths, drain barrier, and wir…
auto-wood Oct 29, 2026
d2b8a2c
fix(memory): make conformance barriers, staging, and replay determini…
auto-wood Oct 29, 2026
d392633
fix(memory): corpus contract namespaces and deterministic classificat…
auto-wood Oct 29, 2026
96df7d3
fix(memory): discriminating staleness proof, chunk idempotency, equiv…
auto-wood Oct 29, 2026
fcb3184
fix(memory): reproducible matching basis and state-reset determinism
auto-wood Oct 29, 2026
5157a88
fix(memory): snapshot-restore determinism and honest staleness coverage
auto-wood Oct 29, 2026
1f3c2e1
fix(memory): identity remap makes imported-staleness conclusive
auto-wood Oct 29, 2026
4126894
fix(memory): fail cooperative-provider policy violations
auto-wood Oct 29, 2026
8d28820
fix(memory): require exact staged-report map keys
auto-wood Oct 29, 2026
1c8f5a6
docs(memory): public reference pages and nav
auto-wood Oct 29, 2026
af543ea
docs(memory): fix principal import path and records-create wording
auto-wood Oct 29, 2026
37f5f09
feat(memory): sqlite provider storage and low-complexity ops
auto-wood Oct 29, 2026
04c4398
fix(schemas): make grants-revoke revoked a boolean
auto-wood Oct 29, 2026
c7ee0b9
fix(schemas): make records-delete tombstoned a boolean
auto-wood Oct 29, 2026
89a7139
feat(memory): sqlite provider capture, candidates, records, recall
auto-wood Oct 29, 2026
99ad26b
feat(memory): sqlite provider profile and reflections
auto-wood Oct 29, 2026
e9be19f
fix(schemas): make imports-discard discarded a boolean
auto-wood Oct 29, 2026
87acc6e
feat(memory): sqlite provider transfer surfaces
auto-wood Oct 29, 2026
3d92a28
test(schemas): pin chunk and polled-receipt type generation
auto-wood Oct 29, 2026
70943dd
fix(memory): emit the documented activate completion result
auto-wood Oct 29, 2026
2540a32
test(memory): conformance interpreter and sqlite-provider run
auto-wood Oct 29, 2026
69c7310
test(memory): conformance directives, receipt eviction, and stage refs
auto-wood Oct 29, 2026
d143661
fix(memory): close the sqlite conformance inconclusives
auto-wood Oct 29, 2026
58485e4
feat(memory): shared loopback memory host with transfer serving
auto-wood Oct 29, 2026
c31e05c
chore(merge): integrate p5-memory-conformance (fixtures, vectors, sql…
auto-wood Oct 29, 2026
20b3e46
chore(merge): integrate p5-memory-conformance-b (interpreter directiv…
auto-wood Oct 29, 2026
c681c8e
test(memory): corpus interpreter loopback leg
auto-wood Oct 29, 2026
c698ff8
chore(merge): integrate p5-loopback-leg (corpus interpreter loopback …
auto-wood Oct 29, 2026
e113750
fix(memory): provider clock and receipt identity, wire determinism re…
auto-wood Oct 29, 2026
f3399b6
chore(merge): integrate p5-memory-conformance-b plan QC fix wave into…
auto-wood Oct 29, 2026
0024065
fix(memory): single receipt allocation and real recall page comparison
auto-wood Oct 29, 2026
0f343fb
chore(merge): integrate p5-memory-conformance-b QC fix round 2 into i…
auto-wood Oct 29, 2026
6defa01
fix(memory): scope foreign digest assertion to the active provider
auto-wood Oct 29, 2026
568e6e8
Merge branch 'iteration/v0.15-memory' into plan/p5-memory-conformance-b
auto-wood Oct 29, 2026
13722ff
chore(merge): integrate p5-memory-conformance into iteration/v0.15-me…
auto-wood Oct 29, 2026
46253c0
chore(merge): integrate p5-memory-conformance-b (interpreter directiv…
auto-wood Oct 29, 2026
36ae371
docs(memory): reconcile staging receipts, freeze no-op, and affirmati…
auto-wood Oct 29, 2026
9acbd3c
chore(merge): integrate p6-memory-docs-release into iteration/v0.15-m…
auto-wood Oct 29, 2026
4005721
fix(toy-world): compare echoed computable through the Shared0 newtype
auto-wood Oct 29, 2026
23bf970
fix(memory): normalize omitted extensions to {} before the bundle-dig…
auto-wood Oct 29, 2026
d144f56
fix(connect): keep the admitted memory provider task alive past the s…
auto-wood Oct 29, 2026
84e675d
fix(connect): apply the recall cursor offset before the page budget; …
auto-wood Oct 29, 2026
debe834
fix(connect-ts): gate memory success payloads through SUCCESS_SHAPES
auto-wood Oct 29, 2026
245c4f2
chore(merge): integrate PR #114 hotfixes (greptile findings + toy-wor…
auto-wood Oct 29, 2026
f9d7623
fix(connect): adapt ffi manifest test to the shared ExtensionKey
auto-wood Oct 29, 2026
905f3c5
chore(merge): integrate ffi ExtensionKey adaptation into iteration/v0…
auto-wood Oct 29, 2026
04ea867
fix(connect): uncertain outcome on panic paths; runtime-derived test …
auto-wood Oct 29, 2026
2ba483c
chore(merge): integrate Phase 5 hotfix round 2 (uncertain-on-panic, r…
auto-wood Oct 29, 2026
f0ebec9
build(connect): refresh xcframework from CI artifact 40830800944
auto-wood Oct 29, 2026
bac5a5e
fix(schemas): require idempotency_key on keyed receipt branches in TS…
auto-wood Oct 29, 2026
29a5f7d
fix(memory): guard recall serialization and partition asymmetry
auto-wood Oct 29, 2026
4c5c21d
build(connect): refresh xcframework from CI artifact 40849346231
auto-wood Oct 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
8 changes: 7 additions & 1 deletion .mstar/specs/spoke-connect.md
Original file line number Diff line number Diff line change
Expand Up @@ -374,7 +374,7 @@ Open string (documented, not JSON Schema enum). Schema `description` on `Connect

`extract` is a **whole-operation** core op: `payload` carries the existing extraction request envelope itself and the success `payload` carries the existing extraction response envelope (`{ candidates, run, extensions? }`) — no `{ request }` / `{ result }` wrapper. The serving host performs the extraction orchestration, including source loading through its own in-process loader port, so the loaded input value is host-local and is never a request or response field. Its requester-side surface is the `extract` method on the remote adapter ([`spoke-remote-adapter.md`](spoke-remote-adapter.md) D4).

Reserved product prefixes are open strings documented in specs only — the connect schema `description` on `ConnectInvokeRequest.op` lists the eight core values and stays closed to product prefixes. `port.*` is the reserved product prefix for proxied `BaselinePorts` method calls — the baseline six families plus the optional `project` / `compute` / `listForkTimelineEvents` methods ([`spoke-remote-adapter.md`](spoke-remote-adapter.md)); `tools.<ns>.<tool_id>` is the reserved product prefix for self-describing tool invokes declared in `HostCapabilityManifest.tools[]` (see [`spoke-data-model.md`](spoke-data-model.md) §HostCapabilityManifest and §[Op dispatch gate](#op-dispatch-gate)).
Reserved product prefixes are open strings documented in specs only — the connect schema `description` on `ConnectInvokeRequest.op` lists the eight core values and stays closed to product prefixes. `port.*` is the reserved product prefix for proxied `BaselinePorts` method calls — the baseline six families plus the optional `project` / `compute` / `listForkTimelineEvents` methods ([`spoke-remote-adapter.md`](spoke-remote-adapter.md)); `tools.<ns>.<tool_id>` is the reserved product prefix for self-describing tool invokes declared in `HostCapabilityManifest.tools[]` (see [`spoke-data-model.md`](spoke-data-model.md) §HostCapabilityManifest and §[Op dispatch gate](#op-dispatch-gate)). `memory.*` is the reserved product prefix for the optional `spoke-memory` family — one op per typed `MemoryPort` method, 33 ops across three capability flags ([`spoke-memory.md`](spoke-memory.md) §7).

Unknown `op` values are valid on the wire; receivers return `ErrorEnvelope` with an appropriate `code` (e.g. `op_unsupported`) when they cannot handle them. Connect does not close the vocabulary. The core vocabulary above MUST stay in sync with the schema `description` fields under `schemas/connect/` and the corresponding ops schema text under `schemas/ops/`.

Expand All @@ -389,10 +389,13 @@ Required capabilities (core table):
| `upsert`, `promote`, `relate`, `check`, `assemble` | `spoke-baseline` (or a deployment-documented synonym that both peers list and intersect into `negotiated_capabilities`) |
| `project`, `compute` | `l2-computable` |
| `extract` | `ke-extraction` |
| `memory.*` (reserved product prefix; 33 ops) | `spoke-memory` for the 25 core ops; `spoke-memory-reflection` for `memory.reflections.state` / `.list` / `.generate`; `spoke-memory-transfer` for `memory.exports.*` / `memory.imports.*` |
| `tools.<ns>.<tool_id>` (reserved product prefix) | the op string itself |

`tools.*` is a **core gate rule**: `tools.<ns>.<tool_id>` ops are self-describing, so the required capability is the op string itself — no registry, no umbrella flag. This is the core-table counterpart of `port.*` being product-map territory: a `tools.*` op never consults a product capability map. A tool id enters `negotiated_capabilities` only when both hellos list that exact string (the agreed-subset rule of §[Session-core state machine](#session-core-state-machine)); the gate then evaluates that exact string as for every op.

**`memory.*` family rule (`MEM-R019`, `MEM-R020`).** The 33 memory ops carry core-table rows, split by the family's three flags (§4.1 and §7 of [`spoke-memory.md`](spoke-memory.md)): 25 core ops require `spoke-memory`, the 3 `memory.reflections.*` ops require `spoke-memory-reflection`, and the 5 `memory.exports.*` / `memory.imports.*` ops require `spoke-memory-transfer`. A host declaring a sub-flag MUST also declare `spoke-memory`; a host declaring only `spoke-memory` denies the sub-flag ops with `capability_missing` before any handler runs, with zero side effects. **No fallback exists:** when `spoke-memory` is not negotiated, memory semantics have no substitute on the wire — a peer MUST NOT emulate them through `KnowledgeEntry`, `modules.*`, `Scope.viewpoint`, or `port.*` ops (`MEM-R019`), and the memory grant model never consults `ke-ownership` / `Scope.viewpoint` semantics (`MEM-R020`): memory ops carry no `Scope` and the `ke-ownership` conjunct below never applies to them.

**Conditional capability requirement — declared Scope viewpoint (`ke-ownership`).** The Scope-bearing remote ops — `port.scope.list_knowledge_entries`, `port.scope.list_timeline_events`, `port.fork.list_timeline_events` — carry one payload-dependent conjunct on top of their row capability: when the request payload declares `scope.viewpoint` as a non-empty string, `negotiated_capabilities` MUST also contain `ke-ownership`. The predicate reads that declared location only — no trimming, normalization, holder lookup, owner comparison, or recursive scan of arbitrary JSON — so `owner` / `disclosure` in a knowledge entry, a top-level `viewpoint`, `extensions.*`, tool `arguments.scope`, source anchors, and opaque metadata never trigger it. Identifiers are opaque: a whitespace-only viewpoint is non-empty and triggers the conjunct. `extract` and the `tools.*` family carry no Scope and never require `ke-ownership`.

The conjunct is **additional, never a replacement**: a viewpoint-bearing Scope op still requires its own row capability (`spoke-baseline`, or `l5-fork` for the fork timeline op) plus `ke-ownership`. Because the requirement is payload-dependent it is evaluated at the remote/product dispatch boundary rather than in the core table: `required_capability(op)` keeps its op-only signature and no `ke-ownership` op exists. A host that cannot satisfy the conjunct answers the existing dispatch-deny branch (`op_unsupported`) before any host side effect — the same wire code as a missing row capability, with no new wire code introduced. A peer-selection layer that filters on cached advertised manifests applies the same predicate as a **hard capability filter**, never a soft preference; advertisement is not authorization, so the selected peer's responder still evaluates the conjunct against its negotiated set.
Expand Down Expand Up @@ -445,6 +448,8 @@ A new or modified ops family that is intended to be remotely invokable over conn

**`ke-ownership` (conditional conjunct, not an op):** the ownership capability is advertised in `HostCapabilityManifest.capabilities` like any other capability, but it maps to **no** `op` row. It is the payload-dependent conjunct of §[Op dispatch gate](#op-dispatch-gate) over the Scope-bearing ops: a request that declares a non-empty `scope.viewpoint` requires it **in addition to** the row capability. Registration therefore declares the capability name only — the predicate over the declared Scope stays at the dispatch boundary, not in the core table.

**`spoke-memory` family (reserved product prefix):** registers through items 1–4 — 33 stable `memory.*` strings (§7 of [`spoke-memory.md`](spoke-memory.md)) kept in sync with this spec and the `description` fields under `schemas/ops/`; the three capability names `spoke-memory`, `spoke-memory-reflection`, `spoke-memory-transfer` advertised in `HostCapabilityManifest.capabilities` (both peers list the exact string for it to enter `negotiated_capabilities`); and opaque `payload` wrapping of the existing `memory-*` request/response envelopes. No connect envelope field changes. The serving host exposes the connect-owned `RemoteMemoryService` seam, which `MemoryPortService` implements over a provider `MemoryPort` (typed per-op delegation plus a peer→`Principal` admission context) — see [`spoke-remote-adapter.md`](spoke-remote-adapter.md) D4/D14.

Connect schemas and the six envelope shapes stay closed; extensibility is vocabulary + capabilities + opaque payload, not new connect fields.

## Tools over connect
Expand Down Expand Up @@ -763,6 +768,7 @@ The Rust reference maps these envelopes onto rust-libp2p: **noise** for authenti
| [`spoke-data-model.md`](spoke-data-model.md) | `HostCapabilityManifest` field tables (embedded by hello) |
| [`spoke-ops.md`](spoke-ops.md) | Ops wire + error envelope (wrapped as opaque invoke payloads) |
| [`spoke-operations.md`](spoke-operations.md) | Lifecycle helpers; adapter ports; `HostManifestPort` |
| [`spoke-memory.md`](spoke-memory.md) | `spoke-memory` family — 33 `memory.*` ops riding these envelopes, capability split, `MEM-R019`/`MEM-R020` fallback prohibition |
| [`schemas/README.md`](../../schemas/README.md) | Connect schema files under `schemas/connect/` |
| [`crates/spoke-connect/README.md`](../../crates/spoke-connect/README.md) | Rust reference (libp2p transport + Path B uniffi binding surface) |
| [`CONCEPTS.md`](../../CONCEPTS.md) | Connect envelope family / Session (connect) / peer_id vocabulary |
Expand Down
2 changes: 1 addition & 1 deletion .mstar/specs/spoke-data-model.md
Original file line number Diff line number Diff line change
Expand Up @@ -932,7 +932,7 @@ Normative mirror of the Spoke Protocol Research canvas `TYPE_MAP`. Integrators c
- **ComputableFieldMap** — open object for `body.state` and `body.computable` under `l2-computable`
- **BodyAttribute** — scalar trait item in `body.attributes[]` (`trait_type` + `value`; optional `display_type`, `max_value`)
- **ComputableLogEntry** — Moment-scale presentation on `TimelineEvent.computable_logs` (not Finding)
- **World KB / Author Memory** — product-local stores; mapped via adapters in a later iteration, not redefined here
- **World KB / Author Memory** — World KB stays a product-local store mapped via adapters. Author Memory is standardized as the optional `spoke-memory` capability family: thirteen models in `schemas/data/` (reusing `SourceAnchor` and the common primitives) and 33 `memory.*` ops, documented in [`spoke-memory.md`](spoke-memory.md) rather than duplicated here. A product that does not implement the family keeps memory product-local and MUST NOT emulate memory semantics through KnowledgeEntry, `modules.*`, `Scope.viewpoint`, or `port.*` ops (`MEM-R019`); memory grants are self-contained and never consult `ke-ownership` (`MEM-R020`)
- **Finding** — checker output, not a KnowledgeEntry body
- **HostCapabilityManifest** — in-process adapter self-description (`host_id`, `roles`, `capabilities`, `namespaces`); distinct from KnowledgeEntry
- **Host role** — open string in `HostCapabilityManifest.roles[]`; core vocabulary: `data-store`, `input-source`, `checker`, `assembler`, `computable-engine`
Expand Down
Loading
Loading