instar 1.3.596 → 1.3.597
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.
- package/dist/core/LiveTestRunner.d.ts +66 -0
- package/dist/core/LiveTestRunner.d.ts.map +1 -0
- package/dist/core/LiveTestRunner.js +85 -0
- package/dist/core/LiveTestRunner.js.map +1 -0
- package/package.json +1 -1
- package/src/data/builtin-manifest.json +2 -2
- package/upgrades/1.3.597.md +21 -0
- package/upgrades/side-effects/live-test-runner.md +28 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LiveTestRunner — the orchestrator that APPLIES the live-user-channel-proof standard
|
|
3
|
+
* to the cross-machine transfer (docs/specs/live-user-channel-proof-standard.md §6 —
|
|
4
|
+
* the first feature held to the bar). It encodes the capstone flow that a user-role
|
|
5
|
+
* session runs:
|
|
6
|
+
*
|
|
7
|
+
* 1. MOVE THE SEAT FIRST — transfer the (throwaway) topic to the target machine.
|
|
8
|
+
* If the transfer reports the seat did NOT move, the capstone premise is false and
|
|
9
|
+
* we stop loudly (that "ok:true but moved nothing" lie is the original bug — we
|
|
10
|
+
* refuse to paper over it).
|
|
11
|
+
* 2. Then run the LiveTestHarness over a scenario matrix that sends a real message
|
|
12
|
+
* through each channel and asserts the reply was served FROM the target machine
|
|
13
|
+
* (the `responderMachine` expectation — the deterministic cross-machine proof).
|
|
14
|
+
*
|
|
15
|
+
* This module is pure orchestration over the injected harness + an injected `transfer`
|
|
16
|
+
* action, so it is unit-testable with fakes. The server.ts route wires the real
|
|
17
|
+
* RealChannelDriver (real senders + placement reader) into the harness and the real
|
|
18
|
+
* `POST /pool/transfer` into `transfer`.
|
|
19
|
+
*
|
|
20
|
+
* Honesty contract: a non-moved seat THROWS (never records a misleading PASS); a moved
|
|
21
|
+
* seat that then fails to reply-from-target is a normal harness FAIL (recorded with the
|
|
22
|
+
* responder mismatch). The artifact only ever shows PASS when the seat moved AND the
|
|
23
|
+
* reply genuinely came from the target machine.
|
|
24
|
+
*/
|
|
25
|
+
import type { LiveTestHarness } from './LiveTestHarness.js';
|
|
26
|
+
export interface TransferResult {
|
|
27
|
+
/** Did the seat genuinely move (the honest signal, NOT a bare ok:true)? */
|
|
28
|
+
seatMoved: boolean;
|
|
29
|
+
detail?: string;
|
|
30
|
+
}
|
|
31
|
+
export interface MultiMachineCapstoneOpts {
|
|
32
|
+
featureId?: string;
|
|
33
|
+
/** The machine the seat must move to (e.g. the Mini's machine id) — also the expected responder. */
|
|
34
|
+
targetMachine: string;
|
|
35
|
+
/** The throwaway Telegram topic id (also the placement key the responder reader uses). */
|
|
36
|
+
telegramTopicId: string;
|
|
37
|
+
/** Optional Slack channel id for the Slack half of the Telegram-AND-Slack bar. */
|
|
38
|
+
slackChannelId?: string;
|
|
39
|
+
/** The real transfer action (server.ts injects POST /pool/transfer). MUST report seatMoved honestly. */
|
|
40
|
+
transfer: (topicId: string, toMachine: string) => Promise<TransferResult>;
|
|
41
|
+
/** The user message to send (default a benign probe). */
|
|
42
|
+
message?: string;
|
|
43
|
+
timeoutMs?: number;
|
|
44
|
+
runId?: string;
|
|
45
|
+
}
|
|
46
|
+
export declare class LiveTestRunnerError extends Error {
|
|
47
|
+
constructor(message: string);
|
|
48
|
+
}
|
|
49
|
+
export declare class LiveTestRunner {
|
|
50
|
+
private readonly deps;
|
|
51
|
+
constructor(deps: {
|
|
52
|
+
harness: LiveTestHarness;
|
|
53
|
+
logger?: (m: string) => void;
|
|
54
|
+
});
|
|
55
|
+
private log;
|
|
56
|
+
/**
|
|
57
|
+
* Run the multi-machine transfer capstone. Throws LiveTestRunnerError if the seat did
|
|
58
|
+
* not move (the capstone cannot meaningfully run). Otherwise returns the harness
|
|
59
|
+
* artifact (PASS only when the reply came FROM `targetMachine`).
|
|
60
|
+
*/
|
|
61
|
+
runMultiMachineTransferCapstone(opts: MultiMachineCapstoneOpts): Promise<{
|
|
62
|
+
artifact: import("./LiveTestArtifactStore.js").LiveTestArtifact;
|
|
63
|
+
entry: ReturnType<import("./LiveTestArtifactStore.js").LiveTestArtifactStore["write"]>;
|
|
64
|
+
}>;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=LiveTestRunner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LiveTestRunner.d.ts","sourceRoot":"","sources":["../../src/core/LiveTestRunner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAkC,MAAM,sBAAsB,CAAC;AAG5F,MAAM,WAAW,cAAc;IAC7B,2EAA2E;IAC3E,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,wBAAwB;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oGAAoG;IACpG,aAAa,EAAE,MAAM,CAAC;IACtB,0FAA0F;IAC1F,eAAe,EAAE,MAAM,CAAC;IACxB,kFAAkF;IAClF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wGAAwG;IACxG,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IAC1E,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,OAAO,EAAE,MAAM;CAC5B;AAED,qBAAa,cAAc;IACb,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE;QAAE,OAAO,EAAE,eAAe,CAAC;QAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE;IAE7F,OAAO,CAAC,GAAG;IAEX;;;;OAIG;IACG,+BAA+B,CAAC,IAAI,EAAE,wBAAwB;;;;CAiDrE"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LiveTestRunner — the orchestrator that APPLIES the live-user-channel-proof standard
|
|
3
|
+
* to the cross-machine transfer (docs/specs/live-user-channel-proof-standard.md §6 —
|
|
4
|
+
* the first feature held to the bar). It encodes the capstone flow that a user-role
|
|
5
|
+
* session runs:
|
|
6
|
+
*
|
|
7
|
+
* 1. MOVE THE SEAT FIRST — transfer the (throwaway) topic to the target machine.
|
|
8
|
+
* If the transfer reports the seat did NOT move, the capstone premise is false and
|
|
9
|
+
* we stop loudly (that "ok:true but moved nothing" lie is the original bug — we
|
|
10
|
+
* refuse to paper over it).
|
|
11
|
+
* 2. Then run the LiveTestHarness over a scenario matrix that sends a real message
|
|
12
|
+
* through each channel and asserts the reply was served FROM the target machine
|
|
13
|
+
* (the `responderMachine` expectation — the deterministic cross-machine proof).
|
|
14
|
+
*
|
|
15
|
+
* This module is pure orchestration over the injected harness + an injected `transfer`
|
|
16
|
+
* action, so it is unit-testable with fakes. The server.ts route wires the real
|
|
17
|
+
* RealChannelDriver (real senders + placement reader) into the harness and the real
|
|
18
|
+
* `POST /pool/transfer` into `transfer`.
|
|
19
|
+
*
|
|
20
|
+
* Honesty contract: a non-moved seat THROWS (never records a misleading PASS); a moved
|
|
21
|
+
* seat that then fails to reply-from-target is a normal harness FAIL (recorded with the
|
|
22
|
+
* responder mismatch). The artifact only ever shows PASS when the seat moved AND the
|
|
23
|
+
* reply genuinely came from the target machine.
|
|
24
|
+
*/
|
|
25
|
+
export class LiveTestRunnerError extends Error {
|
|
26
|
+
constructor(message) { super(message); this.name = 'LiveTestRunnerError'; }
|
|
27
|
+
}
|
|
28
|
+
export class LiveTestRunner {
|
|
29
|
+
deps;
|
|
30
|
+
constructor(deps) {
|
|
31
|
+
this.deps = deps;
|
|
32
|
+
}
|
|
33
|
+
log(m) { this.deps.logger?.(`[live-test-runner] ${m}`); }
|
|
34
|
+
/**
|
|
35
|
+
* Run the multi-machine transfer capstone. Throws LiveTestRunnerError if the seat did
|
|
36
|
+
* not move (the capstone cannot meaningfully run). Otherwise returns the harness
|
|
37
|
+
* artifact (PASS only when the reply came FROM `targetMachine`).
|
|
38
|
+
*/
|
|
39
|
+
async runMultiMachineTransferCapstone(opts) {
|
|
40
|
+
// 1. Move the seat FIRST — and demand the honest seatMoved signal.
|
|
41
|
+
const t = await opts.transfer(opts.telegramTopicId, opts.targetMachine);
|
|
42
|
+
if (!t.seatMoved) {
|
|
43
|
+
throw new LiveTestRunnerError(`transfer to ${opts.targetMachine} did not move the seat (${t.detail ?? 'seatMoved=false'}) — ` +
|
|
44
|
+
`capstone cannot run (refusing to record a misleading PASS over a non-move)`);
|
|
45
|
+
}
|
|
46
|
+
this.log(`seat moved to ${opts.targetMachine}; running channel scenarios`);
|
|
47
|
+
// 2. Build the matrix — each channel asserts the reply was served FROM targetMachine.
|
|
48
|
+
const message = (opts.message ?? `live-test probe ${opts.runId ?? ''}`).trim();
|
|
49
|
+
const surfaces = opts.slackChannelId ? ['telegram', 'slack'] : ['telegram'];
|
|
50
|
+
const scenarios = [
|
|
51
|
+
{
|
|
52
|
+
id: 'mm-transfer-telegram-reply-from-target',
|
|
53
|
+
description: `after transfer to ${opts.targetMachine}, the Telegram reply is served FROM it`,
|
|
54
|
+
surface: 'telegram',
|
|
55
|
+
riskCategory: 'happy-path',
|
|
56
|
+
volatility: 'safe',
|
|
57
|
+
channelId: opts.telegramTopicId,
|
|
58
|
+
input: message,
|
|
59
|
+
expect: { replyNotEmpty: true, responderMachine: opts.targetMachine },
|
|
60
|
+
...(opts.timeoutMs ? { timeoutMs: opts.timeoutMs } : {}),
|
|
61
|
+
},
|
|
62
|
+
];
|
|
63
|
+
if (opts.slackChannelId) {
|
|
64
|
+
scenarios.push({
|
|
65
|
+
id: 'mm-transfer-slack-reply-from-target',
|
|
66
|
+
description: `after transfer to ${opts.targetMachine}, the Slack reply is served FROM it (channel parity)`,
|
|
67
|
+
surface: 'slack',
|
|
68
|
+
riskCategory: 'channel-parity',
|
|
69
|
+
volatility: 'safe',
|
|
70
|
+
channelId: opts.slackChannelId,
|
|
71
|
+
input: message,
|
|
72
|
+
expect: { replyNotEmpty: true, responderMachine: opts.targetMachine },
|
|
73
|
+
...(opts.timeoutMs ? { timeoutMs: opts.timeoutMs } : {}),
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
const matrix = {
|
|
77
|
+
featureId: opts.featureId ?? 'multi-machine-transfer',
|
|
78
|
+
surfaces,
|
|
79
|
+
riskCategories: opts.slackChannelId ? ['happy-path', 'channel-parity'] : ['happy-path'],
|
|
80
|
+
scenarios,
|
|
81
|
+
};
|
|
82
|
+
return this.deps.harness.run(matrix, opts.runId ? { runId: opts.runId } : {});
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=LiveTestRunner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LiveTestRunner.js","sourceRoot":"","sources":["../../src/core/LiveTestRunner.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "./builtin-manifest.schema.json",
|
|
3
3
|
"schemaVersion": 1,
|
|
4
|
-
"generatedAt": "2026-06-16T10:35
|
|
5
|
-
"instarVersion": "1.3.
|
|
4
|
+
"generatedAt": "2026-06-16T10:44:35.492Z",
|
|
5
|
+
"instarVersion": "1.3.597",
|
|
6
6
|
"entryCount": 201,
|
|
7
7
|
"entries": {
|
|
8
8
|
"hook:session-start": {
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Upgrade Guide — vNEXT
|
|
2
|
+
|
|
3
|
+
<!-- assembled-by: assemble-next-md -->
|
|
4
|
+
<!-- bump: patch -->
|
|
5
|
+
|
|
6
|
+
## What Changed
|
|
7
|
+
|
|
8
|
+
`LiveTestRunner` (spec §6) — the orchestrator that applies the live-test standard to the cross-machine transfer, ships DARK (not wired). It transfers the throwaway topic to the target machine, demands the honest `seatMoved` signal (throws if the seat didn't move — no misleading PASS over the original "ok:true but moved nothing" bug), then runs the LiveTestHarness over a matrix asserting the reply was served FROM the target machine (the cross-machine proof). Pure orchestration over an injected harness + transfer action.
|
|
9
|
+
|
|
10
|
+
## What to Tell Your User
|
|
11
|
+
|
|
12
|
+
Nothing yet — internal harness infrastructure, ships dark (no runtime surface). The payoff is the capstone: proving a real Laptop↔Mini seat move with a reply served from the destination, through the real channels.
|
|
13
|
+
|
|
14
|
+
## Summary of New Capabilities
|
|
15
|
+
|
|
16
|
+
None user-facing. Internally: the orchestration that runs the multi-machine transfer capstone and records the signed PASS/FAIL artifact. No new routes, config, or flags (the route wrapper is the next increment).
|
|
17
|
+
|
|
18
|
+
## Evidence
|
|
19
|
+
|
|
20
|
+
- `tests/unit/LiveTestRunner.test.ts` — 5 tests: non-move throws (no harness run), moved+reply-from-target→PASS, moved+wrong-machine→FAIL, slack channel-parity scenario added, empty-reply→FAIL.
|
|
21
|
+
- `tsc --noEmit` clean. instar-dev gate green.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Side-Effects Review — LiveTestRunner (multi-machine transfer capstone orchestrator)
|
|
2
|
+
|
|
3
|
+
**Slug:** live-test-runner
|
|
4
|
+
**Spec:** docs/specs/live-user-channel-proof-standard.md §6 (apply the standard to multi-machine — the first feature)
|
|
5
|
+
**Files:** src/core/LiveTestRunner.ts, tests/unit/LiveTestRunner.test.ts
|
|
6
|
+
**Posture:** ships DARK — pure orchestration over an injected harness + transfer action. NOT wired into server.ts.
|
|
7
|
+
|
|
8
|
+
## What it is
|
|
9
|
+
LiveTestRunner encodes the capstone flow: (1) transfer the throwaway topic to the target machine and DEMAND the honest `seatMoved` signal (throw if it didn't move — refuse a misleading PASS over the original "ok:true but moved nothing" bug); (2) run the LiveTestHarness over a matrix that sends a real message per channel and asserts the reply was served FROM the target machine (the `responderMachine` expectation = the cross-machine proof).
|
|
10
|
+
|
|
11
|
+
## Phase 1 — Principle check (signal vs authority)
|
|
12
|
+
Not a decision gate over agent behavior — it's a test orchestrator. The one control-flow decision (throw on `seatMoved===false`) is a FAIL-LOUD on a test premise, not a runtime authority over messages/sessions. Compliant: it produces a PASS/FAIL artifact (a signal the completion gate already consumes), holds no blocking authority.
|
|
13
|
+
|
|
14
|
+
## Phase 4 — Side-effects answers
|
|
15
|
+
1. **Over-block** — n/a (no runtime block). Throwing on a non-moved seat is intended: it prevents recording a PASS when the premise failed. The alternative (running anyway) would manufacture a misleading verdict.
|
|
16
|
+
2. **Under-block** — the runner trusts the injected `transfer`'s `seatMoved`. If a transfer LIES (reports seatMoved=true but didn't move), the harness still catches it downstream: the reply's `responderMachine` won't equal target → FAIL. So a lying transfer can't produce a false PASS — the responder assertion is the real backstop.
|
|
17
|
+
3. **Level-of-abstraction fit** — correct: thin orchestration over the merged harness + an injected transfer. It does NOT reimplement transfer or the harness; it sequences them. The server.ts route injects the real `/pool/transfer` + RealChannelDriver.
|
|
18
|
+
4. **Signal vs authority** — compliant (produces an artifact; no authority).
|
|
19
|
+
5. **Interactions** — none yet (dark, unwired). When wired, it CALLS `/pool/transfer` (a real seat move on a THROWAWAY topic) then sends real messages — those surfaces are the server.ts route's review. The runner itself only sequences injected actions.
|
|
20
|
+
6. **External surfaces** — none in this increment (unwired). When wired, the real transfer + sends are external — but scoped to a throwaway topic/demo channel by the caller (the §5.3 isolation in DemoChannelRegistry + the throwaway-topic choice).
|
|
21
|
+
7. **Multi-machine posture** — this IS the multi-machine capstone: it proves a seat moves between machines and the reply is served from the destination. The `responderMachine` assertion (via the driver's placement reader, which reads the authoritative `/pool/placement`) is the cross-machine proof. No single-machine assumption — the whole point is cross-machine.
|
|
22
|
+
8. **Rollback cost** — trivial: dark, unwired. Revert the commit.
|
|
23
|
+
|
|
24
|
+
## No-deferrals
|
|
25
|
+
The server.ts route (`POST /live-test/run`) that wires the real driver + transfer, and the demo-channel sender-credential provisioning, are the NEXT tracked steps (CMT-1568, `.instar/plans/live-test-harness-drivers-BUILD.md` GATE 1/2), not deferrals of this orchestrator. This module is complete + unit-tested (5 tests: non-move throws, moved+reply-from-target PASS, wrong-machine FAIL, slack-parity scenario, empty-reply FAIL).
|
|
26
|
+
|
|
27
|
+
## Phase 5 — Second-pass review
|
|
28
|
+
Borderline (it has a control-flow throw), but it adds no runtime authority over messages/sessions/lifecycle — it orchestrates a test and records an artifact. The genuine cross-machine safety (no false PASS) rests on the harness's responder assertion (reviewed in #1195/#1196), which this can't bypass. Not required; noted.
|