instar 1.3.347 → 1.3.348

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "$schema": "./builtin-manifest.schema.json",
3
3
  "schemaVersion": 1,
4
- "generatedAt": "2026-06-06T05:48:21.704Z",
5
- "instarVersion": "1.3.347",
4
+ "generatedAt": "2026-06-06T06:16:53.583Z",
5
+ "instarVersion": "1.3.348",
6
6
  "entryCount": 199,
7
7
  "entries": {
8
8
  "hook:session-start": {
@@ -0,0 +1,57 @@
1
+ # Upgrade Guide — vNEXT
2
+
3
+ <!-- assembled-by: assemble-next-md -->
4
+ <!-- bump: minor -->
5
+
6
+ ## What Changed
7
+
8
+ **Coherence Journal mesh transport (P1 closing step)** — the `journal-sync`
9
+ MeshCommand + receive handler + own-stream advert on the `session-status`
10
+ response + `PeerPresencePuller` delta-drive that runs the merged
11
+ `JournalSyncApplier` over the existing 30s machine check-in
12
+ (COHERENCE-JOURNAL-SPEC §3.4 rule 5). Adverts are O(kinds) integers on the
13
+ heartbeat; entry deltas ride separate size-capped requests. Ships DARK
14
+ everywhere (gated on explicit `multiMachine.coherenceJournal.replication.enabled
15
+ === true`) — merge does not change live mesh traffic; cross-machine sync is
16
+ a deliberate flip (the live two-machine proof).
17
+
18
+ The MTP red-team harness resolver (`src/redteam/ScenarioPack.ts`) now states its
19
+ governance verdicts honestly. Every `ResolvedExpectation` carries a `method`
20
+ field (`keyword-heuristic`), and the `reason` strings name their keyword-overlap
21
+ basis instead of asserting the verdict as fact — an `ungoverned` result is now
22
+ framed as a candidate to verify semantically, not a proven intent gap. The
23
+ matching logic is unchanged; only the verdict's self-description.
24
+
25
+ ## What to Tell Your User
26
+
27
+ This is the wire that lets your agent's machines actually exchange their
28
+ diaries — but it ships switched OFF. Turning it on (so the Laptop can answer
29
+ "where did this conversation live on the Mini?") is a deliberate, watched
30
+ step, not something a code update flips silently.
31
+
32
+ Nothing user-facing changes. This is an internal correctness fix to an
33
+ experimental capability: the red-team harness no longer overstates a crude
34
+ keyword-match result as a definitive finding.
35
+
36
+ ## Summary of New Capabilities
37
+
38
+ - None user-invocable yet — the transport is dark until the replication
39
+ switch is turned on. Internal: `journal-sync` mesh verb + advert-driven
40
+ delta replication.
41
+
42
+ - `ResolvedExpectation.method` field for provenance of every governance verdict.
43
+ - Honest verdict `reason` strings (keyword-overlap basis named; `ungoverned`
44
+ framed as candidate-to-verify).
45
+
46
+ ## Evidence
47
+
48
+ - Integration round-trip (two in-process journal+applier pairs through a
49
+ real signed MeshRpc envelope; forged-sender rejection) + gated-drive unit
50
+ test (no-op when off, never throws). tsc + full lint chain clean.
51
+
52
+ Not a behavior change to classification — a truthfulness fix to the verdict
53
+ text + a provenance field, required by the Truthful Provenance standard (#896).
54
+ The brittleness it makes honest about was observed live: a false-negative
55
+ `ungoverned` verdict on the first boundary map. Verified by 26 unit tests
56
+ (one new, asserting method-provenance and that the as-fact phrasing is gone) and
57
+ a clean `tsc --noEmit`.
@@ -0,0 +1,9 @@
1
+ # The diaries actually sync now (P1 closing step — mesh transport)
2
+
3
+ P1.1 made each machine keep its diaries, P1.2 made them readable, P1.3 built the engine that safely receives a peer's diary. This is the wire that connects them: machines now actually hand each other their diaries over the secure line they already use.
4
+
5
+ It's deliberately tiny and cheap. The existing once-every-30-seconds "are you alive?" check between machines now carries one extra scrap of information: a peer's "I'm at line N in each of my diaries." When a machine notices a peer is further along than the copy it holds, it asks for just the missing lines — over a separate, size-capped request, so the fast heartbeat itself never gets heavy. The receiving side runs every defense from P1.3 (a machine can only hand over its OWN diary; every line validated; restores caught; nothing trusted until durably saved).
6
+
7
+ **The safety choice that matters:** this ships DARK even on me. Merging it does NOT turn on cross-machine syncing. The transport and the drive are gated behind an explicit "replication on" switch that defaults off everywhere — so landing this code changes nothing about live mesh traffic. Turning it on between the Laptop and the Mini is a separate, deliberate, watched step (the live proof you pre-approved). This is on purpose: the mesh is load-bearing for everything, and "merge a PR" should never silently rewire it.
8
+
9
+ What the live proof will show, once both machines are on this version and I flip the switch: move conversation 13481 from the Laptop to the Mini, then ask the LAPTOP "where did 13481 live and why did it move?" — and it answers correctly from the Mini's synced diary. That's the whole initiative's promise, demonstrated end to end. After the proof, the switch can become the spec's default (live-on-dev); until then it stays off so nothing surprises us.
@@ -0,0 +1,49 @@
1
+ # Side-Effects Review — Coherence Journal mesh transport (P1 closing step)
2
+
3
+ **Version / slug:** `coherence-journal-meshwire`
4
+ **Date:** `2026-06-05`
5
+ **Author:** `echo`
6
+ **Second-pass reviewer:** `not required as a PR-time pass — design converged (§3.4 rule 5); this is the transport that drives the already-merged, already-reviewed JournalSyncApplier`
7
+
8
+ ## Summary of the change
9
+
10
+ Wires the `journal-sync` mesh transport (COHERENCE-JOURNAL-SPEC §3.4 rule 5) that drives the merged `JournalSyncApplier`: a `journal-sync` MeshCommand (read/observe RBAC class), an always-registered receive handler (serve own-stream batch / apply inbound), the own-stream advert piggybacked on the `session-status` response, and the `PeerPresencePuller` delta-drive (request + apply when a peer is ahead). The SEND/drive path is gated on `multiMachine.coherenceJournal.replication.enabled === true` (explicit true only) — ships DARK on every agent including echo; merge does not alter live mesh traffic.
11
+
12
+ ## Decision-point inventory
13
+ - `journal-sync` RBAC classification — ADD — read/observe class (any registered peer), same as capacity-report/session-status. No new authority: it serves/accepts replica DATA, never an actuation.
14
+ - Replication activation — gated on explicit `replication.enabled===true`; absent in ConfigDefaults → false everywhere. The proof flips it deliberately.
15
+
16
+ ## 1. Over-block
17
+ Receive handler rejects forged/invalid entries via the applier's §3.4 gates (already reviewed) — counted, never silent. No new over-block surface on the live path (drive is dark).
18
+
19
+ ## 2. Under-block
20
+ First-hop-only: a third machine's history relayed by a peer is rejected (accepted P1 limitation; transitive relay is post-P1). The receive handler being always-on is safe because the applier validates every entry and no peer SENDS unless its own replication flag is on.
21
+
22
+ ## 3. Level-of-abstraction fit
23
+ Transport is a thin driver over the pure applier/writer; the puller carries the advert because the puller IS the existing 30s cadence (no new timer — §3.4 rule 5's grounded correction). Right seam.
24
+
25
+ ## 4. Signal vs authority compliance
26
+ **Required reference:** [docs/signal-vs-authority.md](../../docs/signal-vs-authority.md)
27
+ - [x] No — the transport moves signal data (replica streams). The §3.9 actuation-ban lint (merged) keeps consumers signal-only.
28
+
29
+ ## 5. Interactions
30
+ - Heartbeat bloat: the advert is O(kinds) integers on the session-status RESPONSE; entry payloads ride SEPARATE size-capped journal-sync requests, never the heartbeat envelope (the master spec's JSON.stringify-on-hot-path root cause is avoided).
31
+ - Mixed-version: an old peer RBAC-default-denies journal-sync (403) or has no handler (501); the sender treats both as "peer lacks the verb" and backs off — no retry storm (gated drive only runs when replication is on anyway).
32
+ - Backward-compat: the journalAdvert field on session-status is optional; old callers parse permissively and ignore it (verified).
33
+ - guardWrite seam: replica appends go through state.guardJournalWrite (standby-safe, prefix-allowlisted) — same as the writer.
34
+
35
+ ## 6. External surfaces
36
+ - New mesh verb on the wire ONLY when replication.enabled===true on the sender. On merge: dark everywhere → zero new mesh traffic. The receive handler accepts journal-sync if a peer ever sends, but no peer sends while dark.
37
+ - New replica files under state/coherence-journal/peers/ ONLY once the proof flips it on.
38
+
39
+ ## 7. Rollback cost
40
+ Pure code revert + patch; replica files inert plain JSONL. The dark default means rollback before the proof is a no-op in practice.
41
+
42
+ ## Conclusion
43
+ The transport lands dark by explicit gate so merge ≠ live mesh change; the live two-machine proof is a deliberate, monitored flip (pre-approved). The §3.4-rule-5 grounded transport (advert on the real 30s pull, deltas separate + capped) is implemented as specified. After a successful proof, the gate can move to the spec's live-on-dev default in a follow-up. Clear to ship dark.
44
+
45
+ ## Second-pass review (if required)
46
+ **Reviewer:** convergence panel (§3.4 design-time) + the live two-machine proof as the closing functional verification.
47
+
48
+ ## Evidence pointers
49
+ - tests/integration/journal-sync-roundtrip.test.ts (two in-process pairs through a real signed envelope; forged-sender rejection), tests/unit/PeerPresencePuller-journal.test.ts (gated drive; no-op when off; never throws).
@@ -0,0 +1,45 @@
1
+ # Side-effects review — red-team resolver verdict honesty
2
+
3
+ ## What this change is
4
+ A two-part honesty fix to `src/redteam/ScenarioPack.ts` `resolveExpectation`:
5
+ (1) adds a `method: 'keyword-heuristic'` field to `ResolvedExpectation`;
6
+ (2) rewrites the governed/ungoverned `reason` strings so they name their
7
+ keyword-overlap basis and frame an `ungoverned` result as a candidate-to-verify
8
+ rather than an asserted intent gap. The matching LOGIC is unchanged — only the
9
+ verdict's self-description.
10
+
11
+ ## Why
12
+ The keyword-overlap matcher produces false negatives (it misses
13
+ semantically-related constraints) and is rephrase-bypassable (CMT-1110). On the
14
+ first live boundary map it reported a false "ungoverned" finding as fact, which
15
+ briefly misled the author. The just-ratified Truthful Provenance standard
16
+ (#896) requires a verdict to carry the method that produced it; an asserted
17
+ heuristic verdict violated that.
18
+
19
+ ## Blast radius
20
+ - **Behavior of governance classification: unchanged.** `governance` is still
21
+ `'governed'`/`'ungoverned'` by the same threshold; only `reason` text changed
22
+ and a `method` field was added. No scenario's pass/fail flips.
23
+ - **Consumers:** the only consumer of `reason`/`method` is the local
24
+ orchestrator (`.instar/scripts/redteam-run.mjs`), which prints them — it now
25
+ prints the honest text. No code branches on the reason string. The new
26
+ `method` field is additive (optional consumers ignore it).
27
+ - **No route, config, lifecycle, or migration surface touched.** Pure-logic
28
+ module with no runtime consumers in the server.
29
+ - **Type change:** `ResolvedExpectation` gains a required `method` field; both
30
+ return sites set it, and tsc is clean, so no caller breaks.
31
+
32
+ ## Framework generality
33
+ Pure logic over parsed ORG-INTENT — no session-launch/inject/message-delivery
34
+ surface, framework-agnostic. No Claude-specific assumption.
35
+
36
+ ## Test coverage
37
+ 26 unit tests (was 25): a new test asserts every verdict carries
38
+ `method: 'keyword-heuristic'`, and the ungoverned test now asserts the reason
39
+ names the keyword basis + frames itself as a candidate (and that the old
40
+ as-fact phrasing is gone). Both sides of the governed/ungoverned boundary
41
+ covered. `tsc --noEmit` clean.
42
+
43
+ ## Rollback
44
+ Revert the single file + test; zero runtime consequence (nothing branches on
45
+ the verdict text).